在控制器调用模型的方法(Call a model method in a Controller)

2019-07-30 01:32发布

我在这里有一定的困难,我无法成功地调用它属于一种方法ProjectPage 模型 ProjectPage 控制器

我有我的ProjectPage控制器:

def index
  @searches = Project.published.financed     
  @project_pages = form_search(params)
end

在我ProjectPage 模型

def form_search(searches)
  searches = searches.where('amount > ?', params[:price_min]) if check_params(params[:price_min])
  @project_pages = ProjectPage.where(:project_id => searches.pluck(:'projects.id'))
end

然而,我无法成功调用form_search 方法

Answer 1:

要完成davidb的答案,你做错了两两件事是:

1)你调用来自控制器的模型的功能,当模型函数模型本身只被定义。 所以,你确实需要调用

Project.form_search

并定义与该功能

def self.form_search

2)你调用从模型PARAMS。 在MVC架构中,模型不知道有关要求任何东西,所以params为没有定义。 相反,你需要的变量传递给你的函数像你已经做...



Answer 2:

三两件事:

1)当你想创建一个类宽方法多数民众赞成不限于类的一个对象,你需要定义它像

def self.method_name
  ..
end

并不是

def method_name
  ...
end

2)这可以使用来完成scopelambda这些都是非常好的功能。 像这样的模型添加:

scope :form_search, lambda{|q| where("amount > ?", q) }

将使你打电话

Project.form_search(params[:price_min])

该谢胜利的步骤将是一个范围添加到ProjectPage模式,使一切都在这个地方它属于!

3)当你调用你需要specifiy这样的模型中控制器类方法:

Class.class_method


Answer 3:

声明这样的模型

def self.form_search(searches)
  searches = searches.where('amount > ?', params[:price_min]) if check_params(params[:price_min])
  @project_pages = ProjectPage.where(:project_id => searches.pluck(:'projects.id'))
end

从控制器调用

@project_pages = ProjectPage.form_search(params)


文章来源: Call a model method in a Controller