Подтвердить что ты не робот

Как добавить параметры в текущий 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

С текущей логикой - я получаю вышеуказанное поведение. Любые предложения?

4b9b3361

Ответ 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"&&params[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 %>