Rails: сохранение параметров строки запроса GET в link_to

У меня есть типичное средство поиска в моем приложении, которое возвращает список результатов, которые можно разбить на страницы, отсортировать, просмотреть с другим значением 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 или мне нужно как-то проанализировать и воспроизвести строку запроса из предыдущего запроса?

Ответы на вопрос(8)

такам 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) %>

Если вы используете это как способ фильтрации результатов поиска, посмотрите на моего помощника :)

Это автоматически удаляет все пустые и ненужные параметры и добавляет класс «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

если ссылки, которые вы обрабатываете, не переданы вам 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

а НЕ со всеми параметрами (включая те, которые получены по пути), это объединить сrequest.query_parameters

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

В противном случае вы получите строки запроса, дублирующие параметры пути, например?action=index&controller=products&foo=bar вместо?foo=bar.

 Agis01 мар. 2016 г., 19:41
Это должен быть принятый ответ.

Вы можете просто бросить элементыparams хэш вlink_to, подобно

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

Как насчет

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

?

 coudron26 июн. 2013 г., 08:30
Что такое рельсы 3.2+, как это сделать?
 Vincent21 сент. 2010 г., 21:14
Это выглядит так же, как я искал. Однако в Rails 3 это устарело. Link_to 'link', request.parameters.merge ({: per_page => 20}) работал для меня.
link_to 'Link', params.merge({:per_page => 20})
Решение Вопроса
link_to 'Link', request.query_parameters.merge({:per_page => 20})
 kikito20 авг. 2015 г., 00:49
Но вы можете избежать этого, используяrequest.query_parameters вместоrequest.parameters
 kikito20 авг. 2015 г., 00:31
Это добавляет некоторые «дополнительные» параметры, такие какcontroller а такжеaction.
 twnaing09 мар. 2017 г., 18:41
использованиеdeep_merge если параметры вашего запроса требуют связанных массивов или вложенного хэша

Ваш ответ на вопрос