在Controller中调用模型方法

sid*_*ney 37 methods controller model ruby-on-rails instantiation

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

我在我的ProjectPage控制器中:

def index
  @searches = Project.published.financed     
  @project_pages = form_search(params)
end
Run Code Online (Sandbox Code Playgroud)

在我的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
Run Code Online (Sandbox Code Playgroud)

但是,我无法成功调用该form_search 方法.

ben*_*ben 63

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

1)当模型函数仅在模型本身中定义时,您从控制器调用模型的函数.所以你需要打电话

Project.form_search
Run Code Online (Sandbox Code Playgroud)

并使用.定义函数

def self.form_search
Run Code Online (Sandbox Code Playgroud)

2)你从模型中调用params.在MVC架构中,模型对请求一无所知,因此没有定义params.相反,你需要将变量传递给你的函数,就像你已经在做的那样......

  • 谢谢`self`是我所缺少的 (3认同)

dav*_*idb 19

三件事:

1.)当你想要创建一个不限于类的对象的类宽方法时,你需要定义它

def self.method_name
  ..
end
Run Code Online (Sandbox Code Playgroud)

并不是

def method_name
  ...
end
Run Code Online (Sandbox Code Playgroud)

2)这可以使用来完成scopelambda这些真的很不错的功能.喜欢这个在模型中添加:

scope :form_search, lambda{|q| where("amount > ?", q) }
Run Code Online (Sandbox Code Playgroud)

会让你打电话

Project.form_search(params[:price_min])
Run Code Online (Sandbox Code Playgroud)

第二步是将ProjectPage模型添加到模型中,以便一切都在它所属的位置!

3.)当您在Controller中调用Class方法时,您需要指定模型,如下所示:

Class.class_method
Run Code Online (Sandbox Code Playgroud)