41

ここでいくつかの問題があります。コントローラーの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 メソッドを正常に呼び出すことができません。

4

3 に答える 3

69

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

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

Project.form_search

で関数を定義します

def self.form_search

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

于 2012-06-21T14:15:08.480 に答える
21

3つのこと:

1.) クラスのオブジェクトに限定されないクラス全体のメソッドを作成する場合は、次のように定義する必要があります

def self.method_name
  ..
end

そしてそうではない

def method_name
  ...
end

scope2.) これは、lambdaこれらの非常に優れた機能を使用して実行できます。モデルに次のように追加します。

scope :form_search, lambda{|q| where("amount > ?", q) }

電話できるようになります

Project.form_search(params[:price_min])

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

3.) コントローラーでクラス メソッドを呼び出すときは、次のようにモデルを指定する必要があります。

Class.class_method
于 2012-06-21T13:55:32.167 に答える
4

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

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)
于 2012-06-21T13:54:17.273 に答える