Использование Rails link_to для ссылок, которые публикуют

86

У меня есть ссылка, по которой мне нужно отправить запрос на публикацию. Обычно я использую jQuery и предотвращаю поведение ссылки по умолчанию, а затем отправляю форму в пункт назначения. Похоже, что Rails сможет мне помочь. Конечно, у этого link_toметода есть возможность указать HTTP-метод POST:

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?
Майк Кэмпбелл
Не могу сделать это в моем контроллере, пользователь должен быть перенаправлен на другой сайт. Похоже, что вы правы, для меня нет встроенного механизма ссылок.
у.

Ответы:

143

Короткий ответ заключается в том, что если то, что вы подразумеваете под «параметрами», является полями формы, то вы просто не можете этого сделать (по крайней мере, не так, как я вижу). Вместо этого вам следует использовать форму с кнопкой отправки, стилизованную под ссылку (если вы хотите, чтобы она выглядела так).

Если, с другой стороны, вы имели в виду параметры запроса , то это сработало бы:

link_to "Profile", profile_path(@profile.id, param1: 'value1', param2: 'value2'), method: :post
Крис Зальцберг
источник
1
Только что обновил свой вопрос, я действительно использую внешний URL-адрес для этих ссылок.
у.
Я добавил примечание, в котором в основном говорится, что то, что вы хотите сделать, невозможно по ссылке. Вам нужна форма с кнопкой отправки.
Крис Зальцберг
3
Важно отметить, что если у пользователя отключен javascript, ссылка по умолчанию будет на запрос «GET».
bkunzi01 07
9

Вы можете закодировать параметры в URL следующим образом:

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

Если он вам не подходит, лучше использовать форму, чем файл link_to.

Адриен Кокио
источник
Это действительно очень хороший способ добавить параметры.
nathanvda
Не подходит для моих нужд, параметры должны быть параметрами POST. Но спасибо, я не знал о методе to_param. Вам также понадобится ?профиль после.
у.
Хорошо, я понимаю, тогда я думаю, вам нужно написать форму. Вы можете написать вспомогательный метод, который будет строить эту форму, если вам нужно повторить эту логику несколько раз.
Adrien Coquio
1
Несмотря на то, что это не отвечает на вопрос OP, вы должны использовать для этого вспомогательный URL-адрес, как в ответе @shioyama
Бен Вест
@BenWest: помощник изначально не использовался, и я предположил, что он имеет смысл (например, это мог быть внешний URL-адрес)
Adrien Coquio
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 с публикацией метода не работает в Internet Explorer.
Пьер-Ив О.
1

Чтобы отправить данные POST, вам нужна форма. Однако вам не нужна кнопка отправки. Если вы хотите, чтобы по какой-то причине это выглядело как ссылка, вы можете сделать это ссылкой, которая отправляет форму через 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')

Боеприпасы Goettsch
источник
1

Параметры и метод http должны быть вместе {param1: 'value1', param2: 'value2', :method: :post}

<%= link_to "Profile", profile_path(@profile), {param1: 'value1', param2: 'value2', method: :post} %>
панпанг
источник