2016-10-04 2 views
0

したがって、私はインデックスアクションで表示されているデータをスコープでフィルタリングしようとしています。ビューでのフィルタフォームの作成

私はそれは、レールコンソールに完全に正常に動作しprofile.rb

scope :fees_to, -> (fees_to) { where("fees_to <= ?", "#{fees_to}") } 

になるようにそれを定義している、私は例えばProfile.fees_to(50)を行うことができますし、それが50

未満のfees_toを持っているすべてのプロファイルを返します。

私が知りたいことは、インデックスビューでこの入力フィルタメソッドを作成する方法です。私はさまざまな方法で私のインデックスビューの情報を収集しようとした

def index 
    @profiles = Profile.where(nil) 
    @profiles = @profiles.fees_to(params[:fees_to]) if params[:fees_to].present? 
end 

、すべては無駄を知るために、次のよう

はindexアクション用profiles_controller.rbでは、コードがあります。

何か助けや助言をいただければ幸いです。ありがとう!

+0

params [:fees_to]が '@profiles = @ profiles.fees_to(params [:fee_to]) 'の代わりに' @profiles = Profile.fees_to(params [:fees_to] ] .present? ' – Pavan

+0

@Pavanは' @ profile'の代わりに 'Profile.'を使うことの違いを親切に説明できますか?さらに、私は自分のフォームをコレクションのためにレンダリングする方法についてはあまり明確ではありません。私は現在、 '<%form_for @profiles do | f | %> 'しかし、それはエラーをレンダリングします。 – angkiki

+0

スコープはクラスメソッドです。それらは 'ClassName.ScopeName'のようなクラスで呼び出されるべきです。 – Pavan

答えて

0

通常、form_forを使用してフォームを作成するときにフォームを作成するときに、フォームは単一のモデルインスタンス、たとえばform_for(@thing)にバインドされます。

しかし、検索クエリやフィルタのようなものを作成するときは、リソースを作成または変更しないことが目的であるため、データバインディングのない簡単な古いフォームが必要になります。

<%= form_tag(profiles_path, method: :get) do %> 
    <% label_tag 'fees_to', 'Maximum fee' %> 
    <% number_field_tag 'fees_to' %> 
    <% submit_tag 'Search' %> 
<% end %> 

def index 
    @profiles = Profile.all 
    @profiles = @profiles.fees_to(params[:fees_to]) if params[:fees_to].present? 
end 

プロファイルを使用しての違いを説明します。 @profileの代わりに?

Profileは定数であり、この場合はクラスProfileを含みます。 @profileはインスタンス変数です。このコンテキストではコントローラに属し、インデックスアクションであるため、ほとんどの場合nilになります。あなたが連鎖するのではなく、

@users = User.where(city: 'London') 
      .where(forename: 'John') 

ことを除い:

@profiles = Profile.all 
@profiles = @profiles.fees_to(params[:fees_to]) if params[:fees_to].present? 

何が起こっていることは、あなただけの範囲を連鎖していることは、この例のように呼び出すことです:あなたがやっているしかし

Profile.fees_to(50) # calls the class method `fees_to` on `Profile`. 
@profile.fees_to(50) # will most likely give a `NoMethodError`. 

変数@profilesを突然変異させる。

+0

最高のおかげで解決策を提供しています。フィルタは機能していません。私はこの行をサーバのログ '' Parameters:{"utf8" => "✓"、 "Fees_to" => "10"} 'で見ることができますが、' Profiles.all.fees_to(10) '私のレールコンソールで動作します。 – angkiki

+0

'number_field_tag 'fee_to''を使ってみてください。何らかの理由で、シンボルを使用する際に大文字と小文字を変更しました。 – max

+0

私は 'fees_to'の下にタイプミスをしたことに気付きました。完璧に動作します!どうもありがとうございます! – angkiki

関連する問題