[英]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.)這可以使用帶有lambda
的scope
來完成這些非常好的功能。 喜歡這個在模型中添加:
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.