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


214

link_to UrlHelperにクエリ文字列パラメーターを追加するのが困難です。たとえば、(will_paginateを介して)並べ替え、フィルター処理、およびページ付けを行うためのUI要素を含むIndexビューがあります。will_paginateプラグインは、クエリ文字列パラメーターのページ内永続性を正しく管理します。

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

編集する

いくつかの課題:

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

    <%= 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要素はないようです。ページサイズの選択リストを作成するコードを見てきましたが、これには(SOなどの)A要素が必要です。この課題の一部は#2に関連し、一部はレコードの存在/非存在に基づいてこのUI要素を非表示/表示することに関連しています。別の言い方をすると、ページングするレコードがある場合にのみ、ページサイズのリンクを含めたいです。さらに、link_toに名前で含める必要はなく、他のQS変数(つまり、ページ、バケット、ソート)を自動的に含めることを好みます。



回答:


341

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

link_to アンカーまたはクエリ文字列を使用してリンクを生成することもできます。

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

link_to "Ruby on Rails search", :controller => "searches", :query => "ruby on rails"
#=> <a href="https://stackoverflow.com/searches?query=ruby+on+rails">Ruby on Rails search</a>

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

1
あなたの答えは私が#1を解決するのに役立ちました:<%= link_to "0"、profiles_path(:bucket => '0'、:sorting => params [:sorting])%>。ありがとう。
クレイグ

これは正しいです。新しい構文は `<%= link_to" Create Note "、new_note_path(sender_id:@ user.id)%>`
gsumk

51

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

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

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

それ以外の場合は、この回答を確認してください:params.mergeとクロスサイトスクリプティング


56
これを行わないでください。これにより、xss攻撃が可能になります。
Daniel Nill 2013

1
DanielNill-缶@あなたは説明
Yarin

3
@Yarin この質問にはかなり良い説明があります。
James

5
@Yarinユーザーによって送信された(必ずしもクリーンアップされていない)パラメータをページに任意に印刷すると、誰かがJavaScriptをエンコードしたリンクを使用してサイトにリンクできます。次に、そのJavaScriptがページに出力されて実行され、Cookieを盗んだり、悪質なタスクを実行したりする可能性があります。Railsはページに印刷したものをクリーニングで通常かなり良いですが、それは後悔するより安全であることが良いでしょう
ピーターNixey

24

既存のパラメーターを保持し、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) %>

4

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

<%= 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 %>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.