代码之家  ›  专栏  ›  技术社区  ›  Vincent

rails:在链接中保留get query string参数

  •  45
  • Vincent  · 技术社区  · 14 年前

    我的应用程序中有一个典型的搜索工具,它返回一个结果列表,这些结果可以分页、排序、以不同的记录/页面值查看等。每个选项都由查询字符串中的参数控制。一个简单的例子:

    /search?q=test&page=2
    

    现在假设我需要显示一组链接,将记录每页的值设置为10、20、30。每个链接必须包括现有的查询参数(可以是一个很长的集合),以及一个新的每页参数。

    /search?q=test&page=2& ... &per_page=10
    /search?q=test&page=2& ... &per_page=20
    /search?q=test&page=2& ... &per_page=30
    

    有没有一种简单的方法只需链接到helper,或者我需要以某种方式解析和复制前一个请求中的查询字符串?

    8 回复  |  直到 8 年前
        1
  •  62
  •   Simon B. Matt Ball    8 年前
    link_to 'Link', request.query_parameters.merge({:per_page => 20})
    
        2
  •  22
  •   Olek    14 年前
    link_to 'Link', params.merge({:per_page => 20})
    
        3
  •  17
  •   Clemens    10 年前

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

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

    否则,将以复制路径参数的查询字符串结束,例如 ?action=index&controller=products&foo=bar 而不是 ?foo=bar .

        4
  •  3
  •   Greg Funtusov    11 年前

    如果要保留现有的参数而不暴露于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) %>
    
        5
  •  2
  •   Reactormonk    14 年前

    你可以把 params 哈希 link_to . 喜欢

    link_to "some_other_link", "/search", :page => params[:page]
    
        6
  •  1
  •   jordinl    14 年前

    怎么样

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

    ?

        7
  •  1
  •   Joe Van Dyk    13 年前

    如果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
    
        8
  •  0
  •   complistic    14 年前

    有点晚了,我知道……

    如果您将此作为筛选搜索结果的方法,请查看我的帮助者:)

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