我有一个链接,我需要用它来提交帖子请求。通常,我会使用 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.
简短的回答是,如果“参数”的意思是表单字段,那么您根本无法做到这一点(至少不能以我能看到的直接方式)。您应该改用带有提交按钮的表单,样式看起来像链接(如果您希望它看起来像)。
另一方面,如果您的意思是query参数,那么这将起作用:
link_to "Profile", profile_path(@profile.id, param1: 'value1', param2: 'value2'), method: :post
请注意,如果用户禁用了 JS 或者您删除了默认提供的不显眼的 JS 库,
link_to
将通过 GET
请求静默提交。
总的来说,我不太喜欢有执行
POST
请求的链接。我认为这就是表单和按钮的作用。
因此,一种简单(且更安全)的替代方法是使用 Rails button_to 助手:
button_to 'Profile', profile_path(@profile, param1: 'value1', param2: 'value2')
button_to
也支持 method
选项,但因为它默认为 post
所以我只是省略了它。
您可以通过这种方式在 URL 中编码参数:
link_to "Profile", 'http://example.com/profile?' + {param1: 'value1', param2: 'value2'}.to_param, method: :post
如果它不符合您的需求,您最好使用表格而不是
link_to
。
对于带 Turbo 的 Rails 7
link_to "Profile", profile_path(@profile), data: { turbo_method: "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 隐藏它(例如“显示:内联”)
参数和http方法要放在一起
{param1: 'value1', param2: 'value2', :method: :post}
<%= link_to "Profile", profile_path(@profile), {param1: 'value1', param2: 'value2', method: :post} %>
link_to 方法创建一个 HTML 超链接,用户可以单击该链接以导航到另一个 URL。它有两个参数 - 第一个是将显示为链接的文本,第二个是链接将导航到的 URL。这是一个例子 <%= link_to "Click here", "/new_page" %> 你可以在这里阅读更多:https://giveitaread.net/rails_link_to/