我的应用程序中有一个典型的搜索工具,它返回一个结果列表,可以对其进行分页,排序,使用不同的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 helper来完成它,或者我需要以某种方式解析并重现先前请求中的查询字符串?
答案 0 :(得分:62)
link_to 'Link', request.query_parameters.merge({:per_page => 20})
答案 1 :(得分:22)
link_to 'Link', params.merge({:per_page => 20})
答案 2 :(得分:17)
将新参数与查询参数合并而不是与所有参数(包括通过路径获得的参数)合并的最简单方法是与 request.query_parameters
合并link_to 'Search', search_path(request.query_parameters.merge({ per_page: 20 }))
否则,您最终会使用复制路径参数的查询字符串,例如?action=index&controller=products&foo=bar
而不是?foo=bar
。
答案 3 :(得分:3)
如果你想保留现有的参数并且不让自己暴露于XSS攻击,请务必清除params哈希值,只留下你的应用程序可以发送的参数:
# 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 :(得分:2)
您可以在params
处抛出link_to
哈希的元素。像
link_to "some_other_link", "/search", :page => params[:page]
答案 5 :(得分:1)
怎么样?
<%= link_to 'Whatever', :overwrite_params => { :pear_page => 20 } %>
答案 6 :(得分: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
答案 7 :(得分: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