使用Rails的link_to创建提交表单的链接

106

我有一个链接需要通过post请求提交。通常,我会使用jQuery阻止链接的默认行为,然后提交表单到目标地址。这似乎是Rails应该能够帮助我的事情。确实,link_to方法有一个选项可以指定POST http方法:

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

这个可以实现,但我还需要添加两个参数。我试了一下:

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。

不要认为你可以这样做。最好使用net/http或HTTParty在你的控制器中完成它。 - Mike Campbell
无法在我的控制器中完成,用户需要被引导到其他网站。看起来你是对的,没有内置的链接机制可以为我完成这个任务。 - at.
6个回答

164

简单回答是,如果你所说的“参数”指的是表单字段,那么你无法这样做(至少我看不出来有一种直接的方式可以实现)。相反,你应该使用一个带有提交按钮的表单,并将其样式设置为链接的样式(如果你想让它看起来像这样)。

另一方面,如果你指的是查询参数,那么这个方法是可行的:

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

1
刚刚更新了我的问题,实际上我正在使用外部URL来处理这些链接。 - at.
我已经添加了一条注释,基本上说明你想要的无法使用链接实现。你需要一个带有提交按钮的表单。 - Chris Salzberg
3
请注意,如果用户禁用了JavaScript,则该链接将默认为“GET”请求。 - bkunzi01

16
请注意,如果用户已禁用JS或者您已删除默认提供的非侵入式JS库,link_to将通过GET请求静默提交。
通常情况下,我不太喜欢具有POST请求功能的链接。我认为这是表单和按钮的职责。
因此,一个简单(且更安全)的替代方法是使用Rails button_to助手:
button_to 'Profile', profile_path(@profile, param1: 'value1', param2: 'value2')

button_to也支持method选项,但由于它默认为post,所以我只是省略了它。

button_to同样支持method参数,但因其默认值为post,故本人已省略该参数。


同意Kostas的观点。此外,使用method post的link_to在Internet Explorer上效果不佳。 - Pierre-Yves O.

10

针对Turbo的Rails 7

link_to "Profile", profile_path(@profile), data: { turbo_method: "post" }

8
您可以通过以下方式在URL中编码参数:
link_to "Profile", 'http://example.com/profile?' + {param1: 'value1', param2: 'value2'}.to_param, method: :post

如果不符合您的需求,最好使用一个表单而不是link_to

这确实是一种非常好的添加参数的方式。 - nathanvda
不符合我的需求,参数需要是POST参数。但还是谢谢,我不知道to_param方法。你还需要在profile后面加上“?”号。 - at.
好的,我明白了,那么我认为你需要编写一个表单。如果您需要多次重复此逻辑,则可以编写一个帮助方法来构建此表单。 - Adrien Coquio
1
尽管这并没有回答楼主的问题,但你应该像@shioyama的回答中那样使用url助手。 - Ben West
@BenWest:一开始没有使用该帮助程序,我以为它很有意义(例如可能是一个外部URL)。 - Adrien Coquio

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} %>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接