我正在尝试使用fields_for命令组合两个模型编辑功能。我正在编辑几个变量。有了这些变量,我想要包含一些与模型相关的基本信息,例如@ line_item.inventory.item。我能做到这一点的唯一方法是创建一个双循环,由于显而易见的原因不起作用。有没有办法将两个参数传递给for循环?
即。 fields_for:line_items& @ order.line_items吗???
<% f.fields_for :line_items do |f| %>
<% for line_item in @order.line_items do %>
<td><%= line_item.inventory.item %></td>
<td><%= f.text_field :inventory_id, :size => 3 %></td>
<td><%= line_item.inventory.unit2_id %></td>
<td><%= line_item.inventory.catalognumber %></td>
<td><%= f.text_field :quantity, :size => 3 %></td>
<td> <%= f.text_field :item_price, :size => 3 %></td>
<td><%= f.text_field :total_price, :size => 3 %></td>
<td><%= f.check_box :received %><b>Received</b> </td>
<td><%= f.text_field :notes %></td>
<td><%= link_to 'remove item', line_item, :confirm => 'Are you sure?', :method => :delete %></td>
</tr>
<% end %>
<% end %>
答案 0 :(得分:2)
你应该看看accepts_nested_attributes_for。如果使用正确,它可以解决您的问题。
假设包含表单是针对订单的,您希望将以下内容添加到订单模型中,如果它尚未存在。
class Order < ActiveRecord::Base
has_many :line_items
accepts_nested_attributes_for :line_items
end
观点:
<% form_for :order do |f| %>
...
Order specific fields
...
<% f.fields_for :line_items do |line_item_form| %>
<% line_item = line_item_form.object
<td><%= line_item.inventory.item %></td>
<td><%= line_item_form.text_field :inventory_id, :size => 3 %></td>
<td><%= line_item.inventory.unit2_id %></td>
<td><%= line_item.inventory.catalognumber %></td>
<td><%= line_item_form.text_field :quantity, :size => 3 %></td>
<td> <%= line_item_form.text_field :item_price, :size => 3 %></td>
<td><%= line_item_form.text_field :total_price, :size => 3 %></td>
<td><%= line_item_form.check_box :received %><b>Received</b> </td>
<td><%= line_item_form.text_field :notes %></td>
<td><%= link_to 'remove item', line_item, :confirm => 'Are you sure?', :method => :delete %></td>
</tr>
<% end %>
fields_for与accepts_nested_attributes_for一起使用并给定关联时,将循环遍历已与父表单构建器的对象关联的所有项目。在所有其他情况下,fields_for不使用循环。
答案 1 :(得分:1)
首先,如果您需要执行嵌套模型,我建议您立即查看these three railscasts。
在你的情况下,我将首先交换“for”和“fields for”:
<% for line_item in @order.line_items do %>
<% f.fields_for :line_item do |f| %>
... (snip)
<% end %>
<% end %>
然后我会意识到我可以将整个fields_for移动到局部视图并使用带有:collection参数的渲染调用:
in order.html.erb:
<%= render :partial => :line_item, :collection => order.line_items %>
in _line_item.html.erb:
<% f.fields_for :line_item do |f| %>
... etc
现在你没有任何“for”。 :)
此外,您的“订单项”位于“@order”对象中,所以我想在某个地方有一个form_for:
<% form_for @order ... %>
...
<%= render :partial => :line_item, :collection => order.line_items %>
...
<% end %>
现在你修复了你的观点。但是你仍然需要让你的Orders模型正确“处理”它的孩子。
答案 2 :(得分:0)
我不确定是否有这样的方法,因为fields_for
块和for
循环基本上是两个不同的东西。所以这不是一个“双循环”。