Rails:保留link_to中的GET查询string参数

我在我的应用程序中有一个典型的search工具,它返回可分页,sorting,用不同的records_per_page值查看的结果列表。每个选项都由查询string中的参数控制。 一个简单的例子:

/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助手或我需要parsing和重现查询string从以前的请求?

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

将新参数与查询参数合并而不是所有参数(包括通过path获得的参数)的最简单方法是与request.query_parameters

 link_to 'Search', search_path(request.query_parameters.merge({ per_page: 20 })) 

否则,您最终将查询string复制path参数,例如?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 hash的元素放在link_to 。 喜欢

 link_to "some_other_link", "/search", :page => params[:page] 

关于什么

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

如果你正在处理的链接没有通过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 

有点晚了,我知道..

如果你使用这个过滤search结果的方式看看我的帮手:)

这会自动删除所有空白和不需要的参数,并添加“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