Использование Rails link_to для ссылок, которые публикуются
У меня есть ссылка, с которой мне нужно отправить запрос на отправку. Обычно я использую 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="#" onclick="location.href='http://example.com/profile'; return false;">Profile</a>
Есть ли способ сделать запрос POST с параметрами с помощью link_to
или любого другого метода Rails? Я использую Rails 3.2.9.
Ответы
Ответ 1
Короткий ответ заключается в том, что если вы подразумеваете под "параметрами", это поля формы, то вы просто не можете этого сделать (по крайней мере, не так просто, как я вижу). Вместо этого вы должны использовать форму с кнопкой отправки, чтобы выглядеть как ссылка (если это то, что вы хотите, чтобы она выглядела).
Если, с другой стороны, вы имели в виду параметры запроса, то это сработало бы:
link_to "Profile", profile_path(@profile.id, param1: 'value1', param2: 'value2'), method: :post
Ответ 2
Вы можете кодировать параметры в URL таким образом:
link_to "Profile", 'http://example.com/profile?' + {param1: 'value1', param2: 'value2'}.to_param, method: :post
Если это не соответствует вашим потребностям, вам лучше использовать форму, чем link_to
.
Ответ 3
Для получения данных 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" )
Ответ 4
Параметры и метод http должны быть вместе {param1: 'value1', param2: 'value2', :method: :post}
<%= link_to "Profile", profile_path(@profile), {param1: 'value1', param2: 'value2', method: :post} %>
Ответ 5
Обратите внимание, что если пользователь отключил JS или вы удалили ненавязчивые JS-библиотеки, которые приходят по умолчанию, link_to
будет отправляться без запроса через запрос GET
.
В общем, я не очень люблю ссылки, которые выполняют запросы POST
. Я думаю, что роль формы и кнопки.
Таким образом, простой (и более безопасный) вариант заключается в использовании Rails button_to помощник:
button_to 'Profile', profile_path(@profile, param1: 'value1', param2: 'value2')
button_to
также поддерживает параметр method
, но по умолчанию он равен POST
, поэтому я просто опустил его.