在访问所述记录的其他属性的值时编辑多个子记录
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>
但是出现了一些问题:
- 我无法调用正在编辑的记录的属性值(比如
productunit.unit.capacity
)
- 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'>
- 提交表单 returns 一个错误
Productunits unit can't be blank
这对于新记录来说是公平的,但在编辑现有记录时绝对不会出现这种情况。
不幸的是,rails guide 在这方面很薄弱。
- 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_unit
。 See the Ruby Style Guide.
对于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>
但是出现了一些问题:
- 我无法调用正在编辑的记录的属性值(比如
productunit.unit.capacity
) - 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'>
- 提交表单 returns 一个错误
Productunits unit can't be blank
这对于新记录来说是公平的,但在编辑现有记录时绝对不会出现这种情况。
不幸的是,rails guide 在这方面很薄弱。
- 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_unit
。 See the Ruby Style Guide.