Додайте параметри запитів до link_to


214

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

Чи є автоматичний механізм для додавання параметрів запиту в заданий маршрут, чи потрібно це робити вручну? Велика кількість досліджень цього, здавалося б, простого споруди залишила мене незрозумілим.

Редагувати

Деякі проблеми:

  1. Якщо у мене є два параметри запиту рядка, відро та сортування, як встановити певне значення для одного з них у link_to, зберігаючи поточне значення іншого? Наприклад:

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

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

це правильно. новий синтаксис: `<% = 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
@Yarin Є досить гарне пояснення цього питання .
Джеймс

5
@Yarin Довільно друкуючи параметри на сторінці, що були надіслані користувачем (і не обов'язково очищаються), дозволяє комусь перейти на ваш сайт за допомогою посилання, що кодує Javascript. Потім Javascript надруковується на сторінку і виконує, потенційно крадучи файли cookie або виконуючи нечесні завдання. Рейки зазвичай досить добре прибирають речі, надруковані на сторінку, але краще бути безпечним, ніж шкода
Пітер Ніксей

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.