Как мне сделать это без использования двойной петли? - PullRequest
2 голосов
/ 17 февраля 2010

Я пытаюсь использовать команду fields_for для объединения двух функций редактирования моделей.Я редактирую несколько переменных.С этими переменными я хотел бы включить некоторую основную информацию, связанную с моделью, такую ​​как @ line_item.inventory.item.Единственный способ сделать это - создать двойной цикл, который не работает по понятным причинам.Есть ли способ передать два аргумента в цикл for?

т.е.fields_for: line_items & @ order.line_items do ???

<% 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 ]

2 голосов
/ 17 февраля 2010

Вы должны посмотреть на 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, при использовании с acceptpts_nested_attributes_for и заданной ассоциации, будет перебирать все элементы, уже связанные с объектом родительского построителя форм. Во всех остальных случаях fields_for не использует цикл.

1 голос
/ 17 февраля 2010

Прежде всего, если вам нужно сделать вложенные модели, я рекомендую вам просмотреть эти три railscasts немедленно.

В вашем случае я бы начал с замены полей "for" и "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

Теперь у вас нет "для". :)

Кроме того, ваши "позиции" находятся внутри объекта "@order", поэтому я предполагаю, что где-то есть форма form_for:

<% form_for @order ... %>
...
  <%= render :partial => :line_item, :collection => order.line_items %>
...
<% end %>

Теперь ваши взгляды исправлены. Но вам все равно нужно, чтобы модель «Ордена» правильно обрабатывала своих детей.

0 голосов
/ 17 февраля 2010

Я не уверен, что на самом деле есть способ для этого, так как блок fields_for и цикл for - это две разные вещи. Так что на самом деле это не «двойной цикл».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...