Как добавить параметры в текущий URL-адрес в рельсах
У меня есть логика, где я разрешаю сортировку по цене и релевантности. Я делаю это, передавая параметры контроллеру. У моего URL есть параметр - "сортировка", который может иметь значение - "price_lowest" или "default".
Ссылки выглядят так:
<a href="<%= request.fullpath + '&sort=price_lowest' %>">lowest prices</a> |
<a href="<%= request.fullpath + '&sort=default' %>">relevance</a>
проблема с вышеуказанным кодом заключается в том, что он "добавляет" параметры и не "заменяет" их. Я хочу заменить значение параметра & sort = без добавления нового значения. Например. Я не хочу:
../&sort=price_lowest&sort=price_lowest&sort=default
С текущей логикой - я получаю вышеуказанное поведение. Любые предложения?
Ответы
Ответ 1
Если вам нужен только один параметр cgi и вы хотите остаться на одной странице, это очень просто:
<%= link_to "lowest prices", :sort => "price_lowest" %>
Однако, если у вас более одного, вам нужна некоторая логика для сохранения старых. Вероятно, это было бы лучше всего извлечь помощнику, но по существу вы могли бы сделать что-то подобное, чтобы сохранить другие параметры.
<%= link_to "lowest prices", :sort => "price_lowest", :other_param => params[:other] %>
Именованные маршруты действительно помогут вам здесь, если вам нужно перейти на другую страницу.
Ответ 2
Чтобы сохранить параметры, я сделал это:
<%= link_to 'Date', params.merge(sort: "end_date") %>
Однако URL будет некрасивым.
UPDATE
Для Rails 5 используйте:
<%= link_to 'Date', request.params.merge(sort: "end_date") %>
Ответ 3
Если путь не передается методу link_to
, предполагается текущий params
. В Rails 3.2 это самый элегантный способ добавления или изменения параметров в URL-адресе:
<%= link_to 'lowest prices', params.merge(sort: 'end_date') %>
<%= link_to 'relevance', params.merge(sort: 'default') %>
params
является хешем Ruby. Использование merge либо добавит ключ, либо заменит значение ключа. Если вы передадите nil
в качестве значения ключа, он удалит эту пару ключ/значение из хэша.
<%= link_to 'relevance', params.merge(sort: nil) %>
Cite:
Ответ 4
Это не совсем ответ на вопрос, который вы задаете, но подумал ли вы об использовании "Сортировка драгоценного камня" для обработки вашей логики сортировки и просмотреть ссылки?
Ответ 5
Мое рабочее решение на Rails 3.1
конечно, это жесткий код и должен быть реорганизован.
модель товара
def self.get(field,value)
where(field=>value)
end
контроллер элементов
@items=Item.all
if params[:enabled]
@[email protected](:enabled, params[:enabled])
end
if params[:section]
@[email protected](:section_id, params[:section])
end
вспомогательный элемент
def filter_link(text, filters={}, html_options={})
trigger=0
params_to_keep = [:section, :enabled]
params_to_keep.each do |param|
if filters[param].to_s==params[param] && filters[param].to_s!="clear" || filters[param].to_s=="clear"&¶ms[param].nil?
trigger=1
end
if filters[param]=="clear"
filters.delete(param)
else
filters[param]=params[param] if filters[param].nil?
end
end
html_options[:class]= 'current' if trigger==1
link_to text, filters, html_options
end
items index.html.erb
<%= filter_link 'All sections',{:section=>"clear"} %>
<% @sections.each do |section| %>
<%= filter_link section.title, {:section => section} %>
<% end %>
<%= filter_link "All items", {:enabled=>"clear"} %>
<%= filter_link "In stock", :enabled=>true %>
<%= filter_link "Not in stock", :enabled=>false %>