Використання Rails link_to для посилань, які публікують


85

У мене є посилання, за яким мені потрібно надіслати запит на публікацію. Зазвичай я використовую jQuery і запобігаю поведінку посилання за замовчуванням, а потім надсилаю форму до місця призначення. Це здається чимось, що Rails має змогти мені допомогти. Звичайно, link_toметод має можливість вказати метод POST http:

link_to "Profile", 'http://example.com/profile', method: :post

Це працює, але мені також потрібно додати 2 параметри. Я намагався:

link_to "Profile", 'http://example.com/profile', method: post, param1: 'value1', param2: 'value2'

Це просто додало ці параметри до <a>елемента HTML, але не надіслало їх при натисканні на посилання:

<a rel="nofollow" param1="value1" param2="value2" data-method="post" href="http://example.com/profile">Profile</a>

Чи є спосіб зробити запит POST із параметрами за допомогою link_toбудь-якого іншого методу Rails? Я використовую Rails 3.2.9.


не думай, що ти можеш це зробити. мабуть, найкраще це робити у своєму контролері за допомогою net / http або HTTParty?
Mike Campbell

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

Відповіді:


143

Коротка відповідь полягає в тому, що якщо ви маєте на увазі під "параметрами" поля форми, то ви просто не можете цього зробити (принаймні не прямолінійним способом, який я бачу). Натомість вам слід скористатися формою з кнопкою подання, стилізованою так, щоб виглядати як посилання (якщо саме так ви хочете, щоб це виглядало).

Якщо з іншого боку ви мали на увазі параметри запиту , то це спрацювало б:

link_to "Profile", profile_path(@profile.id, param1: 'value1', param2: 'value2'), method: :post

1
Щойно оновив своє запитання, я фактично використовую зовнішню URL-адресу для цих посилань.
в.

Я додав примітку, яка в основному говорить, що те, що ви хочете зробити, неможливо за допомогою посилання. Вам потрібна форма з кнопкою подати.
Кріс Зальцберг,

3
Важливо зазначити, що якщо користувач вимкнув javascript, посиланням за замовчуванням буде запит "ОТРИМАТИ".
bkunzi01

8

Ви можете кодувати параметри в URL-адресі таким чином:

link_to "Profile", 'http://example.com/profile?' + {param1: 'value1', param2: 'value2'}.to_param, method: :post

Якщо це не відповідає вашим потребам, краще скористайтеся формою, ніж a link_to.


Це дійсно дуже хороший спосіб додати параметри.
nathanvda

Не працює для моїх потреб, параметри повинні бути параметрами POST. Але дякую, я не знав про метод to_param. Вам також потрібен ?профіль після.
в.

Добре, я розумію, тоді я думаю, що вам потрібно написати бланк. Ви можете написати допоміжний метод, який створить цю форму, якщо вам потрібно повторити цю логіку кілька разів.
Адріен Кокіо,

1
Незважаючи на те, що це не відповідає на питання ОП, вам слід використовувати для цього URL-помічник, як у відповіді @ shioyama
Бен Вест

@BenWest: спочатку помічник не використовувався, і я припустив, що він був значущим (можливо, це була зовнішня URL-адреса)
Адріен Кокіо,

3

Зверніть увагу, що якщо користувач вимкнув JS або ви видалили ненав’язливі бібліотеки JS, які постачаються за замовчуванням, link_toвони будуть мовчки надіслані черезGET запит.

Загалом, я не дуже люблю мати посилання, які працюють POST запити. Я думаю, що це роль форми та кнопки.

Таким чином, найпростішою (і безпечнішою) альтернативою є використання довідника Rails button_to :

button_to 'Profile', profile_path(@profile, param1: 'value1', param2: 'value2')

button_toтакож підтримує methodопцію, але оскільки вона за замовчуванням, postто я щойно її пропустив.


Погодився з Костасом. Більше того, link_to з методом post не працює добре в Internet Explorer.
П’єр-Ів О.

1

Для того, щоб опублікувати дані, вам потрібна форма. Однак вам не потрібна кнопка подання. Якщо ви хочете, щоб це з якихось причин виглядало як посилання, ви можете насправді зробити це посиланням, яке подає форму через JavaScript. У наведеному нижче прикладі ресурс POST - це просто REST-дія, яка не потребує жодних полів, тому немає елементів введення форми. Якщо ви хочете опублікувати деякі дані, просто помістіть у форму приховані поля введення.

<%= form_tag('http://something_postable', :method => :post, :class => 'internal') %></form>
<%= link_to_function('Label for Link', 'previous("form").submit()', :title => 'Hover text for link') %>

Формі присвоєно клас, щоб ви могли її стилізувати або приховувати за допомогою CSS (наприклад, "display: inline")


1

Параметри та метод http повинні бути разом {param1: 'value1', param2: 'value2', :method: :post}

<%= link_to "Profile", profile_path(@profile), {param1: 'value1', param2: 'value2', method: :post} %>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.