2 Stimmen

Wie kann ich dies tun, ohne eine Doppelschleife zu verwenden?

Ich versuche, den Befehl fields_for zu verwenden, um zwei Modellbearbeitungsfunktionen zu kombinieren. Ich bearbeite mehrere Variablen. Mit diesen Variablen möchte ich einige grundlegende Informationen einfügen, die mit dem Modell verbunden sind, wie z. B. @line_item.inventory.item. Die einzige Möglichkeit, dies zu erreichen, besteht darin, eine Doppelschleife zu erstellen, was aus offensichtlichen Gründen nicht funktioniert. Gibt es eine Möglichkeit, zwei Argumente an eine for-Schleife zu übergeben?

d.h. 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 %>

2voto

EmFi Punkte 23295

Sie sollten sich ansehen accepts_nested_attributes_for . Bei richtiger Anwendung kann es Ihr Problem lösen.

Wenn Sie davon ausgehen, dass es sich bei dem Formular um eine Bestellung handelt, fügen Sie dem Modell "Bestellung" Folgendes hinzu, falls es nicht bereits vorhanden ist.

class Order < ActiveRecord::Base
  has_many :line_items
  accepts_nested_attributes_for :line_items
end

Und die Aussicht:

<% 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, wenn es mit accepts_nested_attributes_for verwendet wird und eine Assoziation angegeben wird, durchläuft alle Elemente, die bereits mit dem Objekt des übergeordneten Formularerstellers verbunden sind. In allen anderen Fällen verwendet fields_for keine Schleife.

1voto

kikito Punkte 49986

Wenn Sie verschachtelte Modelle benötigen, empfehle ich Ihnen zunächst die Ansicht diese drei Bahnsendungen sofort.

In Ihrem Fall würde ich damit beginnen, das "für" und die "Felder für" zu vertauschen:

<% for line_item in @order.line_items do %>
<% f.fields_for :line_item do |f| %>

... (snip)

<% end %>
<% end %>

Dann würde ich erkennen, dass ich die gesamte fields_for in eine partielle Ansicht verschieben und einen Render-Aufruf mit einem :collection-Parameter verwenden könnte:

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

Jetzt haben Sie kein "für" mehr :)

Außerdem befinden sich Ihre "Einzelposten" innerhalb eines "@order"-Objekts, so dass ich mir vorstellen kann, dass es irgendwo ein form_for gibt:

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

Jetzt haben Sie Ihre Ansichten festgelegt. Aber Sie müssen noch dafür sorgen, dass Ihr Orders-Modell seine Kinder richtig "behandelt".

0voto

nowk Punkte 32199

Ich bin mir nicht sicher, ob es wirklich eine Möglichkeit dafür gibt, da die fields_for Block und der Block for Schleife sind im Grunde 2 verschiedene Dinge. Es ist also nicht wirklich eine "Doppelschleife".

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X