2012-08-10 11 views
5

Ich versuche, ein Formular zu erstellen, das es mir ermöglicht, neue Datensätze für eine Zuordnung einzureichen, in der die Verknüpfungseingaben gruppiert sind. Gruppierung und fields_for

class Product < AR::Base 
    has_many :properties 
    accepts_nested_attributes_for :properties 
    end 

Beachten Sie, dass in der Steuerung eine Reihe von Eigenschaften für das Produkt eingebaut werden, so @product.properties.empty? # => false.

Die unten fields_for gibt mir die richtigen Eingänge mit Namen wie product[properties_attributes][0][value].

= form.fields_for :properties do |pform|                                
    = pform.input :value 

Aber sobald ich versuche, und die Gruppe der Verein es nicht mehr erzeugt Eingänge mit den richtigen Namen:

- @product.properties.group_by(&:group_name).each do |group_name, properties| 
    %h3= group_name              
    = form.fields_for properties do |pform|                                
    = pform.input :value 

Diese Eingänge schaffen, die das name Attribut wie product[product_property][value] wenn in der Tat es product[property_attributes][0][value] sein sollte wie im ersten Beispiel.

Die Rails-Dokumentation schlägt vor, dies zu tun:

= form.fields_for :properties_attributes, properties do |pform| 

Aber das gibt einen Fehler „nicht definierte Methode Wert für Array“.

Antwort

6

Sie müssen wie folgt aufgebaut:

- @product.properties.group_by(&:group_name).each do |group_name, properties| 
    %h3= group_name 
    = form.fields_for :properties, properties do |pform| 
    = pform.text_field :value 

Es sollte funktionieren, da Sie accepts_nested_attributes_for :properties Schienen haben, wissen, dass es Felder erstellen angenommen hat, für properties_attributes. Außerdem können Sie attr_accessible :properties_attributes hinzufügen, wenn Sie eines der neuesten Rails verwenden, und wenn Sie nicht fügen Sie es zu Ihrem Modell noch;)

Auch, wenn Sie eine Entscheidungsgrundlage auf einzelne Eigenschaft machen möchten Sie verwenden können, wie auch die folgende Form:

- @product.properties.group_by(&:group_name).each do |group_name, properties| 
    %h3= group_name 
    - properties.each do |property| 
    = form.fields_for :properties, property do |pform| 
     = pform.text_field :value 

Beide sind schön hier beschrieben: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for unter One-To-Many Abschnitt

+0

Dies scheint zu funktionieren, ich weiß nicht, warum ich nicht versuchen ': properties' statt ': property_attributes'. Wird in Kürze angenommen. – Kris

1

Ich kenne keine saubere 'Rails' Lösung für diese Art von Sache, aber ich behandle solche Situationen öfter manuell. zB - Schleife durch die Gruppen und zeige nur bedingt die Eigenschaften an, die in einer bestimmten Gruppe sind.

class Product < AR::Base 
    has_many :properties 
    accepts_nested_attributes_for :properties 

    def group_names 
    properties.map(&:group_name).uniq.sort 
    end 
end 

Nach Ansicht

- for group_name in product.group_names 
    = form.fields_for :properties do |pform| 
    %h3= group_name 
    - if pform.object.group_name.eql?(group_name) 
     = pform.input :value 

Es kann ein wenig Aufwand mit diesem sein, immer wieder die Liste der Eigenschaften von Produkt zu bekommen. Sie können möglicherweise Ihre Assoziation has_many: properties ändern, um die Eigenschaften in der Reihenfolge group_name abzurufen. Dann können Sie% h3 hinzufügen, wenn es sich um eine neue Gruppe handelt.

- previous_group_name = nil 
= form.fields_for :properties do |pform| 
    - if pform.object.group_name != previous_group_name 
    %h3= pform.object.group_name 
    = pform.input :value 
    - previous_group_name = pform.object.group_name 

Einige Ideen für Sie ...