2016-12-21 11 views
1

私はPostのリストを管理するコントローラを持っており、それにフィルタを追加しました。投稿はratingシステム(0-5評価)です。このフィルタを使用すると、ユーザーは表示するレーティングを入力でき、入力されたレーティング以上が表示されます。ページ更新時にRailsコントローラの変数を更新するにはどうしたらいいですか?

たとえば、10件の投稿があり、7件が3.5以上の評価を受けています。ユーザが評価フィルタに3.5を入力した場合、対応する評価の7つの投稿のみが表示されます。ここで

コードされています

index.html.erb

... 
<%= form_tag posts_path, method: :get, class: "form-inline" do %> <!-- form_tag on posts path (index), use get method since we are displaying results and not altering/ submitting new data --> 
    <div class="rating form-group"> 
    <%= label_tag :rating %> 
    <%= number_field_tag :rating, params[:rating], step: 0.5, min: 0, max: 5, class: "form-control" %> 
    <%= submit_tag "Search", name: nil, class: "btn btn-primary"%> 
    </div> 
<% end %> 
... 

ここでは私のインデックスです:

def index 
    @posts = Post.all 
    @posts = Post.where("rating >= ?", params["rating"]) if params["rating"].present? 
end 

私の問題は、私は、ユーザーがいつでも彼らのフィルタを削除しやすさを提供したい、ですページをリフレッシュします。ユーザーがページをリフレッシュするたびにフィルタを削除して10の投稿をすべて表示するにはどうすればよいですか?今すぐフィルタを作成した後で10個の投稿をすべて表示したい場合は、フィールドボックスに移動して番号3.5を削除してからフォームを再送信するか、手動でURLを変更する必要があります。 http://localhost:3000/posts?utf8...&rating=3http://localhost:3000/postsに;ユーザーがページを更新するほうが便利だと思います。

私はこれを言い換えることができますが、ユーザーがページを更新するときにコントローラを@posts = Post.where...から@posts = Post.allに変更するにはどうすればいいですか?

+0

。あなたが条件付きであなたのURLを変更することがあまりにも創造的な場合、あなたは沼地の州の管理領域に入る。簡単な回避策:「フィルタをクリア」ボタンを追加するのはどうですか? 'rating'パラメータなしでフィルタフォームを送信するだけです。 – anyarms

+0

@Iggy、あなたのフォームを投稿リクエストに変更する必要があるため、私は自分の答えを削除しました。あなたはそれを入手する必要がありますか? – chester

+0

@チェスター、それはする必要はありません。同様の結果が得られる限り、すべてのオプションを検討します!どうもありがとう :) – Iggy

答えて

1

あなたのルートはわかりませんが、がposts/indexで、PostsControllerindexメソッドにルーティングされていると仮定できます。 post/indexは両方:get:post要求に対してPostsControllerindex方法に整合されるように、私はあなたのルートの設定を変更します

まず、:

# config/routes.rb 
match 'posts/index' => 'posts#index', as: 'posts', via: [:get, :post] 

次に、私が:postを使用するようにフォームを変更します代わりに:getの方法:

<%= form_tag posts_path, method: :post, class: "form-inline" do %> 
    <div class="rating form-group"> 
     <%= label_tag :rating %> 
     <%= number_field_tag :rating, params[:rating], 
          step: 0.5, min: 0, max: 5, class: "form-control" %> 
     <%= submit_tag "Search", name: nil, class: "btn btn-primary"%> 
    </div> 
<% end %> 

最後に、私はを受け入れるようにwhere句あなたのコントローラーを変更しますあれば提供が、デフォルトの0 nilですparams[:rating]場合:

def index 
    @posts = Post.where("rating >= ?", params[:rating]||=0) 
end 

これは、あなたが...負の定格投稿がありません、あなたがしなければ、あなたは(十分に負の数をデフォルトにできると仮定はもちろんですすべての投稿がより高いと評価されています)。

ユーザーがフォームを送信すると、URLにはクエリ文字列にparams[:rating]が含まれなくなります。

希望すると便利です。

0

ここで問題となるのは、ページを更新するときにクエリ文字列が保持されることです。

これを行うには、URLを置き換えてクエリ文字列を削除する方法があります。最新のブラウザでhistory APiを使用すると、これを行うことができます。

history.replaceState({}, 'some title', '/'); 

ドキュメント/ヘッドレディコールバックにこれを単に差し込むことができます。だからあなたのユーザーは、評価で応答を取得した後、あなたはクエリ文字列なしのURLに戻ります。したがって、リフレッシュされると、評価クエリ文字列なしでサーバーにリクエストが送信されます。

ただし、ユーザーは評価に基づいてページをブックマークに追加することはできません。それをしたいのであれば、要求を投稿するために要求を切り替える必要があります。このwikiページで詳細を確認してください。 `rating`がURLに渡され、(あなたが指摘するように)それをあまりにも含まれていますリフレッシュしますので

https://en.wikipedia.org/wiki/Post/Redirect/Get

関連する問題