在访问所述记录的其他属性的值时编辑多个子记录

editing multiple child records while accessing values of other attributes of said record

对于class

class Product
  has_many :productunits
  accepts_nested_attributes_for :productunits

class Productunit 
  belongs_to :product
  belongs_to :unit

  validates :product_id, presence: true
  validates :unit_id, presence: true

以下形式意味着 更新现有记录(实际上是一个连接 table),同时格式化列中的字段(每个子列一列) ) 并影响一些关于是否应显示该字段的视图逻辑。

<div class='grid-x grid-margin-x'>
  <%= f.fields_for :productunits do |price_fields| %>
    <div class='cell small-2 text-right'>
      <h4><%# productunit.unit.name %> </h4>
      <%# if productunit.unit.capacity == 2 %
      2 <%= label %> <%= price_fields.number_field :price2 %>
      <%# end %>
    </div>
  <% end %>
</div>

但是出现了一些问题:

  1. 我无法调用正在编辑的记录的属性值(比如 productunit.unit.capacity
  2. html 标记无法访问子记录中的自然分隔符以进行格式化 (<div class='cell [...])。更糟糕的是,rails 将子记录 ID 扔到 div 定义之外 </div> <input type="hidden" value="3" name="product[productunits_attributes][1][id]" id="product_productunits_attributes_1_id" /> <div class='cell small-2 text-right'>
  3. 提交表单 returns 一个错误 Productunits unit can't be blank 这对于新记录来说是公平的,但在编辑现有记录时绝对不会出现这种情况。

不幸的是,rails guide 在这方面很薄弱。

  1. I cannot invoke the value of an attribute of record being edited

您可以通过对象方法获取由表单生成器或输入生成器包装的对象:

<div class='grid-x grid-margin-x'>
  <%= f.fields_for :productunits do |price_fields| %>
    <div class='cell small-2 text-right'>
      <h4><%= price_fields.object.unit.name %> </h4>
      <% if price_fields.object.unit.capacity == 2 %
      2 <%= price_fields.label :price2 %> <%= price_fields.number_field :price2 %>

      <% end %>
    </div>
  <% end %>      
</div>

2 The natural break in child records is not accessible to html tags for formatting...

fields_for 只是遍历子记录。它只是一个循环。我猜你只是把 html 弄坏了,就像一个流浪的 </div> 标签或者你用 <%= label %>.

做的任何事情

submitting the form returns an error Productunits unit can't be blankwhich would be fair for a new record, but is definitely not expected when editing an existing one.

您没有传递单位的 ID。 Rails 不会自动执行此操作。使用隐藏输入或集合助手。

<div class='grid-x grid-margin-x'>
  <%= f.fields_for :productunits do |price_fields| %>
    <div class='cell small-2 text-right'>
      <h4><%= price_fields.object.unit.name %> </h4>
      <% if price_fields.object.unit.capacity == 2 %
      2 <%= price_fields.label :price2 %> <%= price_fields.number_field :price2 %>
      <% end %>
      <%= price_fields.collection_select(:unit_id, Unit.all, :id, :name) %> 
      # or
      <%= price_fields.hidden_field(:unit_id) %> 
    </div>
  <% end %>      
</div>

附带说明一下,您应该将您的模型命名为 ProductUnit,将您的模型命名为 table product_units,并在其他地方使用 product_unitSee the Ruby Style Guide.