如何在不使用双循环的情况下执行此操作?

时间:2010-02-16 23:27:49

标签: ruby-on-rails loops

我正在尝试使用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 %>

3 个答案:

答案 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循环基本上是两个不同的东西。所以这不是一个“双循环”。