在Controller中调用模型方法

时间:2012-06-21 13:46:18

标签: ruby-on-rails methods model controller instantiation

我在这里遇到一些困难,我无法在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 方法

3 个答案:

答案 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。)这可以使用scopelambda完成,这些都是非常好的功能。喜欢这个在模型中添加:

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)