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 回答
19

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

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

否则,您最终会得到重复路径参数的查询字符串,例如,?action=index&controller=products&foo=bar而不是?foo=bar.

于 2015-01-06T19:43:48.867 回答
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 回答