2016-03-24 11 views
0

私は、基本的にインデックスアクションの上に位置するフィルタを構築しようとしています。アイデアは、ユーザーが特定の属性のセットをチェックアウトすることができるという点です(他の属性は気にしない属性に対してチェックを外したままにしておきます)。送信した後、その属性を満たすすべての項目が返されます(未チェックの属性は無視されます)。結果をフィルタリングする - Ruby on Rails

私は、これを行う方法についてさまざまな場所でコードの一部を見ましたが、フォームを作成する方法とそのフォームに関連付けられたコントローラアクションを示すものは何も見ていません。また、ほとんどの場合、チェックボックスを使用しようとしていますが、私はそれを行う多くの例を見ていません。

ここに私がこれまで持っているもののサンプルがあります。 :manhattan_servedと:brooklyn_servedは属性の2つの例に過ぎません。私は、ユーザーが一度に5または6の属性をチェックすることができる20のようなものを持っていることを望みます。

/app/views/experts/filtered_experts.html.erb

<%= form_tag filtered_experts_path, method: :get do %> 
    <%= label_tag(:manhattan_served, "Serves Manhattan") %> 
    <%= check_box_tag :manhattan_served, true%> 

    <%= label_tag(:brooklyn_served, "Serves Brooklyn") %> 
    <%= check_box_tag :brooklyn_served, true%> 

<%= submit_tag "Filter", name: nil %> 
<% end %> 

は、ここで私は私のコントローラ

/app/controllers/experts_controller.rb

def filtered_experts 
     @experts = Expert.where(params[filtering_params]) 
    end 

private 

    def filtering_params 
     params.slice(:manhattan_served, :brooklyn_served) 
    end 

右に持っているものです今、私が提出するとき、私は毎回完全なリストを返します。私のレールのサーバログを見ると、これは、コントローラに渡さなっているように見えます:

Processing by ExpertsController#filtered_experts as HTML 
    Parameters: {"utf8"=>"✓", "manhattan_served"=>"true", "brooklyn_served"=>"true"} 

これはちょうど私にブルックリンとマンハッタンを果たすだけの専門家を返さないだろう、なぜ任意のアイデア?

ありがとうございます!私は、しかしあなたを伝えることができ

答えて

0

私はあなたがフィルタリングを達成しようとしているものを完全にはわからないので、私は代替として提案するかわからないんだけど...理由ます「それはすべての結果を返す見直すためのものであり:レールで

params[filtering_params] 

Hash.sliceだけで指定されたキーを持つハッシュのコピーを返しますので、あなたのfiltering_params()の呼び出しは{戻っている:manhattan_served => trueの場合、 :brooklyn_served => true}。

@experts = Expert.where(params[filtering_params]) 

このハッシュルックアップは明らかに失敗するため、nilを返します。

SELECT * from experts WHERE 1=1; 

あなたは単にその呼び出しを変更することで、この1ケースを修正することができます:あなたがnilで.where()を呼び出した場合、それはやってようなものだ

@experts = Expert.where(filtering_params) 

しかし、私はあなたが他に実行されます疑いますあなたがフィルタリングしているパラムの数などに応じて、後で問題が発生します。名前付きスコープを調べることをおすすめします。 AR関係を構築するためにそれらを連鎖させることができ、多くの場合、人々がこれらの問題のいくつかを解決する方法です。

http://guides.rubyonrails.org/active_record_querying.html#scopes

+0

おかげで、私は、同様のスコープでこれを行うに探していました。私が立ち往生したのは、form_tagの情報をコントローラに渡してスコープを呼び出す方法でした。コントローラはどのように見えますか?たとえば、スコープは:manhattan_served、 - > {where(manhattan_served:true)} スコープ:brooklyn_served、 - > {where(brooklyn_served:true)}は現在モデルのスコープです。ユーザーが単にマンハッタンのボックスをチェックするだけの場合、コントローラーはマンハッタンのスコープを呼び出すだけで、ブルックリンのスコープは呼び出されません。 –

+0

あなたが何かにそれらのスコープの定義を変更した場合: 'スコープ:manhattan_served、 - >(manhattan_served){( "のようなmanhattan_served?"、|| = '%' をmanhattan_served)' あなたは、その後にそれらを一緒に連鎖することができますあなたのコントローラ: 「Expert.manhattan_served(params [:manhattan_served])。brooklyn_served(params [:brooklyn_served]) ' 'LIKE%'の効果は、値を指定しないとワイルドカードになります。だから、もしそれらのパラメタの1つが(あなたがそれを提供しなかったので)「無」と評価するならば、それは単にそのフィールドをワイルドカードし、他のパラメタを検索するだけです。両方のparamsを指定すると、両方の明示的な一致が返されます。 – 10dot

+0

ありがとうございます。私はhas_scopeの宝石で行くことになった。私はそれを実際に理解するために一から構築したかったのですが、最終的に何をしたいのですか?最初から構築するのはちょっと複雑すぎるかもしれません。ご協力いただきありがとうございます –

関連する問題