web-dev-qa-db-ja.com

link_toにクエリ文字列パラメーターを追加します

Link_to UrlHelperにクエリ文字列パラメーターを追加するのは困難です。たとえば、並べ替え、フィルター処理、およびページ分割(will_paginate経由)のUI要素を持つインデックスビューがあります。 will_paginateプラグインは、クエリ文字列パラメーターのページ内永続性を正しく管理します。

名前付きルートにクエリ文字列パラメータを追加する自動メカニズムはありますか、それとも手動で行う必要がありますか?この一見単純な構造に関する多くの研究は、私に無知を残しました。

編集

いくつかの課題:

  1. バケットと並べ替えの2つのクエリ文字列パラメーターがある場合、link_toでこれらのいずれかに特定の値を設定し、他方の現在の値を保持するにはどうすればよいですか?例えば:

    <%= link_to "0", profiles_path(:bucket => '0', :sorting=>?? ) %>
    
  2. 複数のクエリ文字列パラメーター、バケット、並べ替え、page_sizeがあり、これらのいずれかに値を設定したい場合、残りのパラメーターの名前と値を「自動的に」含める方法はありますか?例えば:

    <%= link_to "0", profiles_path(:bucket => '0', [include sorting and page_size name/values here] ) %>
    
  3. Will_paginateプラグインは、ページ変数と他のクエリ文字列変数を自動的に管理します。ページサイズを管理するための自動UI要素はないようです。ページサイズの選択リストを作成するコードを見てきましたが、これにはA要素(SOなど)が必要です。この課題の一部は#2に関連しており、一部はレコードの存在/非存在に基づいてこのUI要素を非表示/表示することに関連しています。別の言い方をすると、ページにレコードがある場合にのみページサイズのリンクを含めたいと思います。さらに、link_toに名前で変数を含めるのではなく、他のQS変数(つまり、ページ、バケット、ソート)を自動的に含めることを好みます。

193
craig

link_toのAPIドキュメント は、名前付きルートと古いスタイルの両方のルートにクエリ文字列を追加する例を示しています。これは、あなたの望むことですか?

link_toは、アンカーまたはクエリ文字列を含むリンクも生成できます。

link_to "Comment wall", profile_path(@profile, :anchor => "wall")
#=> <a href="/profiles/1#wall">Comment wall</a>

link_to "Ruby on Rails search", :controller => "searches", :query => "Ruby on Rails"
#=> <a href="/searches?query=Ruby+on+Rails">Ruby on Rails search</a>

link_to "Nonsense search", searches_path(:foo => "bar", :baz => "quux")
#=> <a href="/searches?foo=bar&amp;baz=quux">Nonsense search</a>
318
Fred

迅速で汚い方法が必要で、XSS攻撃を心配しない場合は、params.mergeを使用して以前のパラメーターを保持します。例えば.

<%= link_to 'Link', params.merge({:per_page => 20}) %>

参照: https://stackoverflow.com/a/4174493/445908

それ以外の場合は、この答えを確認してください: params.merge and cross site scripting

50

既存のパラメーターを保持し、XSS攻撃にさらされないようにする場合は、必ずパラメーターハッシュを消去して、アプリが送信できるパラメーターのみを残してください。

# inline
<%= link_to 'Link', params.slice(:sort).merge(per_page: 20) %>

複数の場所で使用する場合は、コントローラーのパラメーターをクリーンアップします。

# your_controller.rb
@params = params.slice(:sort, :per_page)

# view
<%= link_to 'Link', @params.merge(per_page: 20) %>
24
Greg Funtusov

たとえば、次のように、グリフィコンボタンのブロックを渡す場合:

<%= link_to my_url, class: "stuff" do %>
  <i class="glyphicon glyphicon-inbox></i> Nice glyph-button
<% end %>

次に、クエリ文字列のパラメータを渡すには、次の方法を使用します。

<%= link_to url_for(params.merge(my_params: "value")), class: "stuff" do %>
  <i class="glyphicon glyphicon-inbox></i> Nice glyph-button
<% end %>
3
zakelfassi