[英]Call a model method in a Controller
我在这里遇到一些困难,我无法在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
方法 。
要完成davidb的答案,你做错的两件事是:
1)当模型函数仅在模型本身中定义时,您从控制器调用模型的函数。 所以你需要打电话
Project.form_search
并使用。定义函数
def self.form_search
2)你从模型中调用params。 在MVC架构中,模型对请求一无所知,因此没有定义params。 相反,你需要将变量传递给你的函数,就像你已经在做的那样......
三件事:
1.)当你想要创建一个不限于类的对象的类宽方法时,你需要定义它
def self.method_name
..
end
并不是
def method_name
...
end
2.)这可以使用带有lambda
的scope
来完成这些非常好的功能。 喜欢这个在模型中添加:
scope :form_search, lambda{|q| where("amount > ?", q) }
会让你打电话
Project.form_search(params[:price_min])
第二步是将范围添加到ProjectPage
模型中,以便一切都在它所属的位置!
3.)当您在Controller中调用Class方法时,您需要指定模型,如下所示:
Class.class_method
在模型中声明如下
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.