web-dev-qa-db-ja.com

コントローラーでモデルメソッドを呼び出す

私はここでいくつかの問題を抱えています。ProjectPagecontrollerProjectPagemodelに属するメソッドを正常に呼び出すことができません。 。

私のProjectPageコントローラーに:

def index
  @searches = Project.published.financed     
  @project_pages = form_search(params)
end

そして、私のProjectPagemodel

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_searchmethodを正常に呼び出すことができません。

36
sidney

Davidbの答えを完成させるために、あなたが間違っている2つのことは次のとおりです。

1)モデル関数がモデル自体でのみ定義されている場合、コントローラーからモデルの関数を呼び出しています。だからあなたは電話する必要があります

Project.form_search

そして関数を定義します

def self.form_search

2)モデルからparamsを呼び出しています。 MVCアーキテクチャでは、モデルはリクエストについて何も知らないため、paramsはそこで定義されていません。代わりに、すでに実行しているように変数を関数に渡す必要があります...

62
ben

3つのこと:

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

次のステップは、スコープをProjectPageモデルに追加して、すべてが属する場所にあるようにすることです!

3.)ControllerでClassメソッドを呼び出すとき、次のようにModelを指定する必要があります。

Class.class_method
19
davidb

モデルでこのように宣言します

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)
3
Kashiftufail