2012-06-26 17 views
15

Wie kann ich ein Array von Objekten (alle das gleiche Modell) mit fields_for? Das Array enthält Objekte, die vom aktuellen Benutzer erstellt wurden.Verwenden eines Arrays mit fields_for

ich derzeit haben:

<%= f.fields_for :descriptionsbyuser do |description_form| %> 
<p class="fields"> 
    <%= description_form.text_area :entry, :rows => 3 %> 
    <%= description_form.link_to_remove "Remove this description" %> 
    <%= description_form.hidden_field :user_id, :value => current_user.id %> 
</p> 
<% end %> 

Aber ich will das ersetzen: descriptionsbyuser mit einem Array ich in meinem Controller erstellt - @descriptionsFromCurrentUser

Dies ist auch innerhalb Ryan Bate des "nested_form_for"

Alle Hinweise würden sehr geschätzt werden!

Adam

Antwort

18

Docs for fields_for Sie zeigt deutlich die Art und Weise Arrays verwenden:

<%= form_for @person do |person_form| %> 
    ... 
    <%= person_form.fields_for :projects, @active_projects do |project_fields| %> 
    Name: <%= project_fields.text_field :name %> 
    <% end %> 
    ... 
<% end %> 

@active_projects hier ist Ihr Array

:

Oder eine Sammlung verwendet werden.

+0

danke jdoe! Genau das, was ich brauchte! – adamteale

+11

Das funktioniert nicht für mich. Ich bekomme etwas wie 'undefinierte Methode' Name 'für # '. – Ajedi32

+3

@ Ajedi32 et al => Ihr Modell muss einen Setter für die Sammlungsattribute implementieren. Siehe Antwort von kaum bekannt. – barelyknown

22

Um eine Sammlung für fields_for zu verwenden und so zu arbeiten, wie Sie es erwarten, muss das Modell verschachtelte Attribute für die Sammlung akzeptieren. Verwenden Sie dasKlasse-Makro, wenn die Auflistung eine 0-on--Eins-zu-viele-Beziehung ist. Wenn es sich bei der Auflistung nicht um eine Eins-zu-viele-Beziehung ActiveRecord handelt, müssen Sie einen Sammlungs-Getter und einen Auflistungsattribut-Setter implementieren.

Wenn es ein ActiveRecord Beziehung ist:

class Person 
    has_many :projects 

    # this creates the projects_attributes= method 
    accepts_nested_attributes_for :projects 
end 

Wenn es sich um eine nicht-ActiveRecord Beziehung ist:

class Person 
    def projects 
    ... 
    end 

    def projects_attributes=(attributes) 
    ... 
    end 
end 

So oder so, ist die Form, die gleiche:

<%= form_for @person do |f| %> 
    ... 
    <%= f.fields_for :projects, @active_projects do |f| %> 
    Name: <%= f.text_field :name %> 
    <% end %> 
    ... 
<% end %> 
+0

+1 für Nicht-ActiveRecord-Implementierungsdetails.Irgendwie weigerte sich mein Auge zu sehen, was in den Unterlagen klar erklärt wurde ... –

5

Ich fand dies der sauberste Weg

, wenn Sie mit geraden Daten arbeiten und wollen ein Array zurück zu senden, ohne

jeder dieser @objects mit
<%= form_for :team do |t| %> 
    <%= t.fields_for 'people[]', [] do |p| %> 
    First Name: <%= p.text_field :first_name %> 
    Last Name: <%= p.text_field :last_name %> 
    <% end %> 
<% end %> 

Ihre params Daten sollten

"team" => { 
    "people" => [ 
    {"first_name" => "Michael", "last_name" => "Jordan"}, 
    {"first_name" => "Steve", "last_name" => "Jobs"}, 
    {"first_name" => "Barack", "last_name" => "Obama"} 
    ] 
} 
5

eine Ergänzung zu barelyknown Antwort wie diese Rückkehr (konnte aufgrund von Reputationspunkten nicht als Kommentar hinzufügen) -

Für den Nicht-ActiveCord-Fall musste ich in meiner Klasse neben *_attributes=(attributes) auch persisted? definieren.