我在这里遇到一些困难,我无法在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
方法。
答案 0 :(得分:61)
要完成davidb的回答,你做错的两件事是:
1)当模型函数仅在模型本身中定义时,您正在从控制器调用模型的函数。所以你需要打电话
Project.form_search
并使用
定义函数def self.form_search
2)你正在从模型中调用params。在MVC架构中,模型对请求一无所知,因此没有定义params。相反,您需要将变量传递给您的函数,就像您已经在做的那样......
答案 1 :(得分:19)
三件事:
1。)当你想要创建一个不限于类对象的类范围方法时,你需要定义它,如
def self.method_name
..
end
而不是
def method_name
...
end
2。)这可以使用scope
和lambda
完成,这些都是非常好的功能。喜欢这个在模型中添加:
scope :form_search, lambda{|q| where("amount > ?", q) }
将使您能够致电
Project.form_search(params[:price_min])
secound步骤是将范围添加到ProjectPage
模型,以便所有内容都在它所属的位置!
3。)当您在Controller中调用Class方法时,您需要指定模型,如下所示:
Class.class_method
答案 2 :(得分: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)