55

我有一个链接,我需要提交一个发布请求。通常,我会使用jQuery并阻止链接的默认行为,然后将表单提交到目标。这看起来像Rails应该能够帮助我。果然,link_to方法用于指定HTTP POST方法的选择:使用Rails的link_to发布的链接

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> 

有没有办法做一个带参数的POST请求使用link_to或其他Rails方法?我正在使用Rails 3.2.9。

+0

不认为你可以做到这一点。可能最好在你的控制器使用net/http或HTTParty来完成它? –

+0

无法在我的控制器中执行此操作,需要将用户引导至其他站点。看起来你是对的,但没有内置的链接机制来为我做这件事。 –

回答

94

简短的回答是,如果你的意思是“参数”是表单域,那么你根本无法做到这一点(至少不是以我能看到的简单方式)。你应该改用一个带有提交按钮的表单,看起来像一个链接(如果这就是你想要的样子)。

如果在另一方面,你本来还打算查询参数,那么这会工作:

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

如果没有:

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

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

+0

我已经添加了一个说明,基本上说,你想要做的是不可能使用链接。你需要一个带有提交按钮的表单。 –

+2

重要的是要注意,如果用户禁用JavaScript,则链接将默认为“GET”请求。 – bkunzi01

9

您可以在URL这样编码参数根据您的需求,您最好使用比link_to更好的形式。

+0

这确实是添加参数的一种非常好的方式。 – nathanvda

+0

不适合我的需求,参数需要是POST参数。但是,谢谢,我不知道to_param方法。配置文件后还需要一个'?'。 –

+0

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

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隐藏(例如,“显示:内联”)

1

的参数和HTTP方法应该在一起{param1: 'value1', param2: 'value2', :method: :post}

<%= link_to "Profile", profile_path(@profile), {param1: 'value1', param2: 'value2', method: :post} %> 
0

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

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

因此,一个简单的(和更安全的)替代方案是使用Rails的button_to帮手:

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

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