47

私のアプリには、ページ分割、並べ替え、別の 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 ヘルパーだけでそれを行う簡単な方法はありますか、それとも以前のリクエストからクエリ文字列を解析して再現する必要がありますか?

4

8 に答える 8

69
link_to 'Link', request.query_parameters.merge({:per_page => 20})
于 2010-09-21T19:17:44.857 に答える
22
link_to 'Link', params.merge({:per_page => 20})
于 2010-11-13T20:20:09.560 に答える
4

既存のパラメーターを保持し、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) %>
于 2014-05-10T07:44:43.507 に答える
2

paramsでハッシュの要素を投げることができますlink_to。お気に入り

link_to "some_other_link", "/search", :page => params[:page]
于 2010-09-21T16:47:21.287 に答える
1

どうですか

<%= link_to 'Whatever', :overwrite_params => { :pear_page => 20 } %>

于 2010-09-21T18:26:45.713 に答える
1

これは、処理中のリンクが 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
于 2012-06-19T19:22:12.407 に答える
0

少し遅い私は知っています..

検索結果をフィルタリングする方法としてこれを使用している場合は、私のヘルパーを見てください:)

これにより、すべての空白および不要なパラメーターが自動的に削除され、新しいパラメーターがすべて既に設定されている場合は、「選択された」クラスが追加されます。

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
于 2011-06-06T05:51:48.540 に答える