Добавить параметры запроса для link_to

Мне сложно добавить параметры запроса для link_to UrlHelper. Например, у меня есть представление индекса, в котором есть элементы пользовательского интерфейса для сортировки, фильтрации и разбивки на страницы (через will_paginate). Плагин will_paginate правильно управляет внутристраничной персистентностью параметров запроса.

Есть ли автоматический механизм добавления параметров запроса для указания имени маршрута или мне нужно сделать это вручную? Многое исследование этой, казалось бы, простой конструкции оставило меня бессловесным.

Edit

Некоторые из проблем:

  • Если у меня есть два параметра querystring, bucket и sorting, как установить определенное значение для одного из них в link_to, сохраняя текущее значение другого? Например:

    <%= link_to "0", profiles_path(:bucket => '0', :sorting=>?? ) %>
    
  • Если у меня есть несколько параметров querystring, bucket и sorting и page_size, и я хочу установить значение для одного из них, есть ли способ "автоматически" включать имена и значения остальных параметров? Например:

    <%= link_to "0", profiles_path(:bucket => '0', [include sorting and page_size name/values here] ) %>
    
  • Плагин will_paginate автоматически управляет своей переменной страницы и другими переменными запроса. Кажется, что нет автоматического элемента пользовательского интерфейса для управления размером страницы. Хотя я видел код для создания списка размеров страниц, я бы предпочел иметь для этого элементы A (например, SO). Часть этой проблемы связана с №2, часть связана с скрытием/отображением этого элемента пользовательского интерфейса на основе существования/отсутствия записей. С другой стороны, я хочу включить ссылки на размер страницы, если на странице есть записи. Более того, я предпочитаю автоматически включать другие переменные QS (например, страницу, ведро, сортировку), а не включать их по имени в link_to.

Ответ 1

API docs на link_to показывают некоторые примеры добавления повторений на оба именованных и старост-маршрутов. Это то, что вы хотите?

link_to также может создавать ссылки с якорями или строками запроса:

link_to "Comment wall", profile_path(@profile, :anchor => "wall")
#=> <a href="/profiles/1#wall">Comment wall</a>

link_to "Ruby on Rails search", :controller => "searches", :query => "ruby on rails"
#=> <a href="/searches?query=ruby+on+rails">Ruby on Rails search</a>

link_to "Nonsense search", searches_path(:foo => "bar", :baz => "quux")
#=> <a href="/searches?foo=bar&amp;baz=quux">Nonsense search</a>

Ответ 2

Если вам нужен быстрый и грязный способ и не беспокойтесь о атаке XSS, используйте params.merge, чтобы сохранить предыдущие параметры. например.

<%= link_to 'Link', params.merge({:per_page => 20}) %>

см. ниже: fooobar.com/questions/37223/...

В противном случае проверьте этот ответ: params.merge и межсайтовый скриптинг

Ответ 3

Если вы хотите сохранить существующие параметры и не подвергать себя атакам 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) %>

Ответ 4

Если вы хотите передать в блоке, скажем, кнопку глификона, как показано ниже:

<%= link_to my_url, class: "stuff" do %>
  <i class="glyphicon glyphicon-inbox></i> Nice glyph-button
<% end %>

Затем параметры querystrings можно выполнить с помощью:

<%= link_to url_for(params.merge(my_params: "value")), class: "stuff" do %>
  <i class="glyphicon glyphicon-inbox></i> Nice glyph-button
<% end %>