私のアプリには、ページネーション、ソート、別のrecords_per_page値などで表示できる結果のリストを返す典型的な検索機能があります。これらの各オプションは、クエリ文字列のパラメーターによって制御されます。簡単な例:
/search?q=test&page=2
ここで、records_per_pageの値を10、20、30に設定する一連のリンクを表示する必要があるとしましょう。各リンクには、非常に長いセットである既存のクエリパラメータと、新しいper_pageパラメータを含める必要があります。
/search?q=test&page=2& ... &per_page=10
/search?q=test&page=2& ... &per_page=20
/search?q=test&page=2& ... &per_page=30
Link_toヘルパーだけでそれを行う簡単な方法はありますか、それとも以前のリクエストからのクエリ文字列を解析して何らかの方法で再現する必要がありますか?
link_to 'Link', request.query_parameters.merge({:per_page => 20})
link_to 'Link', params.merge({:per_page => 20})
新しいパラメーターをすべてのパラメーター(パスを介して取得したパラメーターを含む)ではなく、クエリパラメーターとマージする最も簡単な方法は、request.query_parametersとマージすることです
link_to 'Search', search_path(request.query_parameters.merge({ per_page: 20 }))
そうしないと、クエリ文字列がパスパラメータを複製することになります。たとえば、?action=index&controller=products&foo=bar
ではなく?foo=bar
になります。
既存のパラメーターを保持し、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) %>
params
ハッシュの要素をlink_to
でスローするだけです。お気に入り
link_to "some_other_link", "/search", :page => params[:page]
これは、処理しているリンクがrequest.paramsによって指定されていない場合に機能します。
require 'rack/utils'
require 'uri'
def modify_query url, options={}
uri = URI(url)
query_hash = Rack::Utils.parse_query(uri.query)
query_hash.merge!(options)
uri.query = Rack::Utils.build_query(query_hash)
uri.to_s
end
puts modify_query('/search?q=test&page=2&per_page=10', 'per_page' => 20)
puts modify_query('/search?q=test&page=2', 'per_page' => 30)
# Outputs
# /search?q=test&page=2&per_page=20
# /search?q=test&page=2&per_page=30
どうですか
<%= link_to 'Whatever', :overwrite_params => { :pear_page => 20 } %>
?
少し遅れてます。
これを検索結果をフィルタリングする方法として使用している場合は、私のヘルパーを見てください:)
これにより、空白の不要なパラメータがすべて自動的に削除され、新しいパラメータがすべてすでに設定されている場合は、クラス「selected」が追加されます。
def search_to s, args={}
selected = 0
args.each do |k, v|
selected = selected + 1 if params[k] == v.to_s || ( params[k].nil? && v.blank? )
end
if @search_params_base.nil?
@search_params_base = request.parameters.clone
@search_params_base.delete(:action)
@search_params_base.delete(:controller)
@search_params_base.delete(:page)
@search_params_base.delete_if{|k, v| v.nil? || v.blank?}
@search_params_base.delete(:utf8) if @search_params_base[:keywords].nil?
end
search_params = @search_params_base.merge(args)
search_params.delete_if{|k, v| v.nil? || v.blank?}
link_to s, search_path + '?' + search_params.to_param, :class => selected == args.length ? 'selected' : nil
end
その後、ビューでこれを使用できます。
search_to '$80 to $110', :price => 80..110
またはあなたの場合:
search_to '30 per page', :page => params[:page], :per_page => 30