我有一个链接,我需要提交一个帖子请求。通常,我会使用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>
有没有办法使用link_to
或任何其他Rails方法使用参数执行POST请求?我正在使用Rails 3.2.9。
答案 0 :(得分:123)
简短的回答是,如果“参数”的含义是表单字段,那么您根本无法做到这一点(至少不是以我能看到的直接方式)。您应该使用带有提交按钮的表单,其形状看起来像一个链接(如果这是您想要的样子)。
如果另一方面你的意思是查询参数,那么这将有效:
link_to "Profile", profile_path(@profile.id, param1: 'value1', param2: 'value2'), method: :post
答案 1 :(得分:8)
您可以通过以下方式对网址中的参数进行编码:
link_to "Profile", 'http://example.com/profile?' + {param1: 'value1', param2: 'value2'}.to_param, method: :post
如果它不符合您的需求,您最好使用表格而不是link_to
。
答案 2 :(得分:2)
要发布数据,您需要一个表单。但是,您不需要提交按钮。如果由于某种原因希望它看起来像链接,您实际上可以使它成为通过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')
答案 3 :(得分:2)
请注意,如果用户已禁用JS,或者您删除了默认情况下不显眼的JS库,则link_to
将通过GET
请求以静默方式提交。
一般来说,我不太喜欢拥有执行POST
请求的链接。我认为这是形式和按钮的作用。
因此,一个简单(更安全)的替代方法是使用Rails button_to帮助器:
button_to 'Profile', profile_path(@profile, param1: 'value1', param2: 'value2')
button_to
也支持method
选项,但默认为post
,所以我只是省略了它。
答案 4 :(得分:1)
参数和http方法应该在一起{param1: 'value1', param2: 'value2', :method: :post}
<%= link_to "Profile", profile_path(@profile), {param1: 'value1', param2: 'value2', method: :post} %>