【问题标题】:Rails form_for only submitting last inputRails form_for 只提交最后一个输入
【发布时间】:2018-05-15 16:14:26
【问题描述】:

我试图通过循环每个产品来创建输入,并为所有输入提交一个表单。目前,表单只提交最后一个输入。我将如何使其提交所有输入?

<%= form_for :inventory do |f| %>
    <% @products.each do |product| %>
      <tr>
        <td><%= product.name %></td>
        <td><%= product.measurement %></td>
        <td><%= f.number_field :amount, class: 'form-control' %></td>
        <%= f.hidden_field :product_id, :value => product.id %>
      </tr>
      <% end %>
     <%= f.submit %>
<% end %>

【问题讨论】:

  • 您需要使隐藏字段对于每次迭代都是唯一的。这里生成的隐藏字段具有相同的 id,它返回最后一个值,因为其他值被覆盖..

标签: ruby-on-rails ruby forms form-for


【解决方案1】:

我不知道您的用例,但您可以使用 gem cocoon 来执行此操作。还有一个添加/删除另一个产品的链接。

https://github.com/nathanvda/cocoon

【讨论】:

    【解决方案2】:

    您可以使用each_with_index 进行迭代:

    <%= form_for :inventory do |f| %>
      <% @products.each_with_index do |product, i| %>
        <tr>
          <%= f.hidden_field "product_id[#{i}]", :value => product.id %>
        </tr>
        <% end %>
      <%= f.submit %>
    <% end %>
    

    输出不是很优雅(类似于"product_id"=&gt;{"0"=&gt;"1", "1"=&gt;"2", "2"=&gt;"3"... }),但它是为了展示每个隐藏字段如何需要一个唯一键的示例。
    您可以以更好的方式定义参数以在控制器中使用它们,只需保持它们唯一即可。

    【讨论】:

      猜你喜欢
      • 2019-08-26
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 2016-03-13
      • 2013-01-13
      相关资源
      最近更新 更多