私はここでいくつかの問題を抱えています。ProjectPage
controllerのProjectPage
modelに属するメソッドを正常に呼び出すことができません。 。
私のProjectPage
コントローラーに:
def index
@searches = Project.published.financed
@project_pages = form_search(params)
end
そして、私のProjectPage
model:
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
methodを正常に呼び出すことができません。
Davidbの答えを完成させるために、あなたが間違っている2つのことは次のとおりです。
1)モデル関数がモデル自体でのみ定義されている場合、コントローラーからモデルの関数を呼び出しています。だからあなたは電話する必要があります
Project.form_search
そして関数を定義します
def self.form_search
2)モデルからparamsを呼び出しています。 MVCアーキテクチャでは、モデルはリクエストについて何も知らないため、paramsはそこで定義されていません。代わりに、すでに実行しているように変数を関数に渡す必要があります...
3つのこと:
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メソッドを呼び出すとき、次のようにModelを指定する必要があります。
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)