98

我有一个链接,我需要使用该链接提交发布请求。通常,我会使用 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。

4

5 回答 5

156

简短的回答是,如果您所说的“参数”是表单字段,那么您根本无法做到这一点(至少不是以我能看到的直接方式)。您应该使用带有提交按钮的表单,其样式看起来像一个链接(如果您希望它看起来像这样)。

另一方面,如果您的意思是查询参数,那么这将起作用:

link_to "Profile", profile_path(@profile.id, param1: 'value1', param2: 'value2'), method: :post
于 2012-11-16T10:32:37.797 回答
8

您可以通过这种方式对 URL 中的参数进行编码:

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

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

于 2012-11-16T10:56:00.700 回答
8

请注意,如果用户禁用了 JS 或者您已删除默认提供的不显眼的 JS 库,link_to则将通过GET请求静默提交。

一般来说,我不太喜欢有执行POST请求的链接。我认为这是表单和按钮的作用。

因此,一个简单(且更安全)的替代方法是使用 Rails button_to助手:

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

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

于 2017-02-16T15:09:25.937 回答
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 设置样式或隐藏它(例如“显示:内联”)

于 2014-09-13T05:31:52.017 回答
1

参数和http方法要在一起{param1: 'value1', param2: 'value2', :method: :post}

<%= link_to "Profile", profile_path(@profile), {param1: 'value1', param2: 'value2', method: :post} %>
于 2015-08-29T08:18:36.297 回答