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


214

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

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

редактировать

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

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

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

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



Ответы:


341

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

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

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

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

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

1
Ваш ответ помог мне решить # 1: <% = link_to "0", profile_path (: bucket => '0',: sorting => params [: sorting])%>. Спасибо.
Крейг,

это правильно. новый синтаксис: `<% = link_to" Создать заметку ", new_note_path (sender_id: @ user.id)%>`
gsumk

51

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

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

см .: https://stackoverflow.com/a/4174493/445908

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


56
Не делайте этого, он открывает вас для xss атак.
Даниэль Нилл

1
@ DanielNill - Можешь объяснить
Ярин,

3
@ Ярин Есть довольно хорошее объяснение на этот вопрос .
Джеймс

5
@ Yarin Произвольная печать параметров на странице, которые были отправлены пользователем (и не обязательно очищены), позволяет кому-либо ссылаться на ваш сайт по ссылке, кодирующей Javascript. Этот Javascript затем распечатывается на странице и запускается, потенциально крадя куки или делая гнусные задачи. Rails, как правило, довольно хорошо чистит вещи, напечатанные на странице, но лучше быть в безопасности, чем
потом

24

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

Тогда передача параметров строки запроса может быть выполнена через:

<%= link_to url_for(params.merge(my_params: "value")), class: "stuff" do %>
  <i class="glyphicon glyphicon-inbox></i> Nice glyph-button
<% end %>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.