2011-11-25 1 views
9

Ho problemi a trovare fields_for per lavorare su un attributo Array di un modello non ActiveRecord.form_for modello non-AR - fields_for L'attributo array non itera

distillata giù, devo seguente:

modelli/parent.rb

class Parent 
    extend ActiveModel::Naming 
    include ActiveModel::Conversion 
    include ActiveModel::Validations 
    extend ActiveModel::Translation 

    attr_accessor :bars 
end 

controller/parent_controller.rb

def new_parent 
    @parent = Parent.new 

    @parent.bars = ["hello", "world"] 
    render 'new_parent' 
end 

viste/new_parent.html.haml

= form_for @parent, :url => new_parent_path do |f| 
    = f.fields_for :bars, @parent.bars do |r| 
    = r.object.inspect 

Con il codice come sopra, la mia pagina contiene ["hello", "world"], ovvero il risultato di inspect chiamato nell'array assegnato a bars. (Con @parent.bars omesso dalla riga fields_for, viene visualizzato solo nil).

Come si può fare fields_for come per un'associazione AR, ovvero eseguire il codice nel blocco una volta per ciascun membro del mio array bars?

+0

Grazie per questo. Non pensavo che nessun altro avesse provato a farlo! Grazie ... molto! – Nitrodist

risposta

11

penso che la tecnica corretta è:

= form_for @parent, :url => new_parent_path do |f| 
    - @parent.bars.each do |bar| 
    = f.fields_for "bars[]", bar do |r| 
     = r.object.inspect 

Piuttosto perché non può essere fatto per lavorare solo non sono sicuro, ma questo sembra fare il trucco.

1

penso che si può fare senza il bisogno di ciascuno:

= form_for @parent, :url => new_parent_path do |f| 
    = f.fields_for :bars do |r| 
    = r.object.inspect 

è necessario impostare alcuni metodi che ci si aspetta nella classe padre per identificare la collezione.

class Parent 
    def bars_attributes= attributes 
    end 
end 

E anche voi bisogno di fare in modo che gli oggetti nella matrice rispondono a persistito (quindi non è possibile utilizzare le stringhe) :(

0

mi piantarono la fields_for e ha aggiunto multipla: vero

= form_for @parent, :url => new_parent_path do |f| 
    - @parent.bars.each_with_index do |bar, i| 
    = f.text_field :bars, value: bar, multiple: true, id: "bar#{i}"