【问题标题】:Rails link_to or button_to post request with parametersRails link_to 或 button_to 使用参数发布请求
【发布时间】:2012-09-03 19:39:23
【问题描述】:

我有一个安静的(脚手架生成的)控制器和投票模型,我只是想在视图中添加一个字段,当单击该字段时,将为给定的汽车创建一个新的投票。它需要是一个 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 %>

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:
    <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 创建操作中可用。

    【讨论】:

      【解决方案2】:

      Rails 5 + haml,例如:

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

      关键是使用 params 键,然后在控制器中你将能够通过 @some_var = params[:start_point]

      获得价值

      【讨论】:

      • 问题是关于制作'post'而不是'get'
      • 这是正确的回应,也与post合作
      【解决方案3】:
      <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 参数哈希中添加您喜欢的任何其他参数 - 用作控制器中其他方法的参数,以采取更高级的操作。

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 这个解决方案至少不适用于 Rails 6.1 中的method: :get。相比之下,@AleksTkachenko 的答案适用于:get(我想也适用于:post)。诚然,问题是关于:post,所以这只是一个评论。
        猜你喜欢
        • 1970-01-01
        • 2011-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-12
        • 1970-01-01
        • 1970-01-01
        • 2018-06-08
        相关资源
        最近更新 更多