Rails中link_to或button_to如何使用参数进行POST请求

36

我有一个基于Restful API(通过脚手架自动生成)的投票控制器和模型,现在我想在视图中添加一个字段,当用户点击该字段时,会为给定的汽车创建一个新的投票。请求需要使用POST方法。在rails中,应该采用什么方式实现这个功能?

<% @cars.each do |car| %>
  <tr>
    <td><%= button_to '+', {:controller => "votes", :action => "create"}, :car_id => car.id, :user_id=> session[:user_id] , :method=>:post  %></td>
    <td><%= car.votes.count %></td>
    <td><%= car.name %></td>
    <td><%= car.code %></td>
    <td><%= car.album %></td>
<% end %>
4个回答

48
<td><%= button_to '+', {:controller => "votes", :action => "create", :car_id => car.id, :user_id=> session[:user_id]} , :method=>:post  %></td>

这将使得params[:car_id]和params[:user_id]在VotesController的create操作中可用。


38

举例来说,Rails 5 + haml:

= button_to "smth", some_path, method: :get, params: { start_point: 3.month.ago }

关键是使用 params 关键字,然后在控制器中,您将能够通过 @some_var = params[:start_point] 获取该值。


问题是关于如何使用“post”而不是“get”。 - buncis
4
这是正确的响应,同时也适用于“post”。 - Nathan Gouy

1
<td><%= button_to '+', {:controller => "votes", :action => "create", :car_id => car.id, :user_id=> session[:user_id]} , {:method=>:post}  %></td>

Erez是正确的 - 在这种情况下,第一个哈希是“URL参数”哈希,它控制按钮发送请求的URL。第二个哈希是“HTML参数”哈希,它控制按钮的外观,以及通过在生成的HTML中添加隐藏字段来提交方法。

令人困惑的是,URL参数要求您以控制器为中心的方式指定控制器和操作,但随后需要传递URL的id,这更加以URL为中心。这种组合让我感到困惑了很长时间。顺便说一下,您可以在URL参数哈希中添加任何其他参数 - 用作控制器中其他方法的参数,以执行更高级的操作。


0

你也可以将参数作为参数传递给路径助手,像这样

<%= button_to '+', votes_path(car_id: card.id), method: 'post'  %>

如果需要,您可以从控制器中获取会话 ID,或者仍然将其传递给路径助手。


1
这个解决方案至少在Rails 6.1中对于 method: :get 不起作用。相比之下,@AleksTkachenko的答案适用于 :get(我想也适用于 :post)。不可否认,问题是关于 :post 的,所以这只是一条评论。 - Masa Sakano

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