【问题标题】:How do I do this without using a double loop?如何在不使用双循环的情况下做到这一点?
【发布时间】:2010-02-16 23:27:49
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails loops


    【解决方案1】:

    您应该查看accepts_nested_attributes_for。如果使用得当,它可以解决您的问题。

    假设包含表单适用于您想要将以下内容添加到 Order 模型中的订单,如果它不存在的话。

    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 不使用循环。

    【讨论】:

      【解决方案2】:

      首先,如果你需要做嵌套模型我建议你立即查看thesethreerailscasts

      在您的情况下,我将从交换“for”和“fields”开始:

      <% 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 模型正确地“处理”它的子节点。

      【讨论】:

        【解决方案3】:

        我不确定是否真的有办法做到这一点,因为fields_for 块和for 循环基本上是两个不同的东西。所以这并不是真正的“双循环”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-24
          • 1970-01-01
          • 2019-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多