使用Rails link_to进行发布的链接


85

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


不要以为你能做到。可能最好在使用net / http或HTTParty的控制器中执行此操作?
Mike Campbell

在我的控制器中无法执行此操作,需要将用户定向到其他站点。看起来您是对的,但是没有内置的链接机制可以为我执行此操作。
在。

Answers:


143

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

另一方面,如果您要查询参数,那么它将起作用:

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

1
刚刚更新了我的问题,实际上我在为这些链接使用外部URL。
在。

我添加了一条注释,基本上说您无法使用链接进行操作。您需要一个带有提交按钮的表单。
克里斯·萨尔茨伯格

3
请务必注意,如果用户禁用了javascript,则该链接将默认为“ GET”请求。
bkunzi01

8

您可以通过以下方式在URL中编码参数:

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

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


实际上,这是添加参数的一种非常不错的方法。
nathanvda 2012年

不能满足我的需要,参数必须是POST参数。但是,谢谢,我不了解to_param方法。您还需要?后配置文件。
在。

好的,我明白了,那么我认为您必须编写一个表格。如果您需要多次重复此逻辑,则可以编写一个帮助程序方法来构建此表单。
Adrien Coquio 2012年

1
尽管这不能回答OP的问题,但您应该为此使用网址帮助程序,例如@shioyama的回答
Ben West

@BenWest:最初没有使用帮助程序,我认为它是有意义的(例如,它可能是外部URL)
Adrien Coquio 2014年

3

请注意,如果用户禁用了JS或您已删除默认情况下不引人注意的JS库,link_to则会通过GET请求以静默方式提交。

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

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

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

button_to也支持该method选项,但由于默认为该选项,post因此我将其省略。


与Kostas达成协议。此外,带有方法发布的link_to在Internet Explorer上无法正常工作。
Pierre-YvesO。

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} %>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.