Rails表单在提交时未正确设置选中的fields_for行为选中状态,在控制器参数中。

4

我花了一些时间纠结于这个问题... 我有一个表单,并且正在利用 fields_for 来处理 PurchaseOrderPurchaseOrderLineItem 关联。

<%= form_with model: [@quote, @purchase_order], local: true do |form| %>
  <% if purchase_order.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(purchase_order.errors.count, "error") %> prohibited this purchase_order from being saved:</h2>

      <ul>
        <% purchase_order.errors.full_messages.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <div class="text-center text-xl text-bold">
    <%= form.label :number, 'PO Number' %>
    <%= form.text_field :number, class: 'text-field-input' %>
  </div>
  <table>
    <tr>
      <th class='px-4 py-2'>Include in PO</th>
      <th class='px-4 py-2'>Part No.</th>
      <th class='px-4 py-2'>Description</th>
      <th class='px-4 py-2'>Condition</th>
      <th class='px-4 py-2'>Total Quantity Requested</th>
      <th class='px-4 py-2'>Quantity Awarded (So Far)</th>
      <th class='px-4 py-2'>Quantity To Award</th>
      <th class='px-4 py-2'>Quantity Quoted</th>
      <th class='px-4 py-2'>Unit Price</th>
      <th class='px-4 py-2'>Total Price</th>
    </tr>
    <% @quote_line_items.each do |line_item| %>
      <%= form.fields_for 'purchase_order_line_items[]', line_item do |cf| %>
        <%= cf.hidden_field :quote_line_item_id, value: line_item.id %>
        <%= cf.hidden_field :id, value: line_item.po_line_item&.id %>
        <tr class='border px-4 py-2 h-12' data-line-item-id=<%= line_item.id %>>
          <td class='border px-4 py-2'><%= cf.check_box(:being_awarded, {class: 'quote-award-checkbox', checked: !!line_item.po_line_item}) %></td>
          <td class='border px-4 py-2'><%= line_item.part.number %></td>
          <td class='border px-4 py-2'><%= line_item.part.description %></td>
          <td class='border px-4 py-2'>
            <%= select_tag(
              :part_condition,
              options_for_select(part_conditions_for_select_options,
                selected: part_conditions_for_select_options[line_item.part_condition]
              )
            ) %>
          </td>
          <td class='border px-4 py-2'><%= line_item.rfq_line_item.quantity %></td>
          <td class='border px-4 py-2'><%= line_item.rfq_line_item.quantity_fulfilled %></td>
          <td class='border px-4 py-2'><%=
            cf.number_field(
              :quantity,
              {
                  value: line_item.po_line_item&.quantity || 0,
                  min: 0, max: line_item.max_allowed_quantity,
                  class: 'awarded-quantity-input number-field-input'
              })
          %></td>
          <td class='border px-4 py-2 quantity'><%= line_item.quantity %></td>
          <td class='border px-4 py-2'><%=
            cf.number_field(
              :unit_price,
              {
                  value: line_item.po_line_item&.unit_price || line_item.unit_price,
                  step: 0.01,
                  class: 'number-field-input unit-price'
              }
            )
          %></td>
          <td class='border px-4 py-2 total-price'><%= line_item.total_price %></td>
        </tr>
      <% end %>
    <% end %>
  </table>

  <div class="actions text-center m-4">
    <%= form.submit 'Submit', class: 'big-btn px-8 py-4' %>
  </div>
<% end %>

这里的问题是子表单复选框未将预期值发送到控制器。
属性being_awarded通常以“未选中”的形式出现,有时[随机]会将某些being_awarded复选框标记为“已选中”。 being_awarded被定义为PurchaseOrderLineItemattr_accessor

如果您发布表单的输出HTML,那将会更加清晰明了。 - Inpego
1个回答

1

有时候就是那些小错误让我们最疯狂...

我在子表单之外开始了循环,因此为每个line_item调用了fields_for,导致出现不稳定的行为。


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