Rails: сохранение параметров строки запроса GET в ссылке на
у меня есть типичное средство поиска в моем приложении, которое возвращает список результатов, которые могут быть разбиты на страницы, отсортированы, просмотрены с другим значением 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 ответов
самый простой способ объединить новые параметры с параметрами запроса, а не со всеми параметрами (в том числе полученными по пути) - это объединить с запрос.query_parameters
link_to 'Search', search_path(request.query_parameters.merge({ per_page: 20 }))
В противном случае вы получите строки запроса, дублирующие параметры пути, например ?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
хэш в link_to
. Как
link_to "some_other_link", "/search", :page => params[:page]
это работает, если ссылки, которые вы обрабатываете, не даются вам по запросу.парамы.
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
немного поздно, я знаю..
Если вы используете это как способ фильтрации результатов поиска, посмотрите на моего помощника:)
это автоматически удаляет все пустые и ненужные параметры и добавляет класс "выбранный", если все новые параметры уже установлены.
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 ' to 0', :price => 80..110
или в вашем случае:
search_to '30 per page', :page => params[:page], :per_page => 30