簡體   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