41

我在这里遇到了一些困难,我无法成功调用属于控制器中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 方法

4

3 回答 3

69

要完成davidb的回答,您做错的两件事是:

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

Project.form_search

并定义函数

def self.form_search

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

于 2012-06-21T14:15:08.480 回答
21

三件事:

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])

第二步是为ProjectPage模型添加一个范围,这样所有东西都在它所属的地方!

3.) 当您在 Controller 中调用 Class 方法时,您需要像这样指定模型:

Class.class_method
于 2012-06-21T13:55:32.167 回答
4

在模型中这样声明

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)
于 2012-06-21T13:54:17.273 回答