繁体   English   中英

在Controller中调用模型方法

[英]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.)这可以使用带有lambdascope来完成这些非常好的功能。 喜欢这个在模型中添加:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM