[RoR3] nested complex forms
Bonsoir,
J'ai besoin de votre oeil expert, je commence donc par vous mettre les sources :
j'ai un immeuble qui peut avoir plusieurs pièces :
Code:
1 2 3 4 5 6
|
immeuble.rb
belongs_to :dossier
has_many :liste_pieces, :dependent => :destroy
accepts_nested_attributes_for :liste_pieces, :reject_if => lambda { |a| a[:piece].blank? }, :allow_destroy => true |
Code:
1 2
| lite_piece.rb
belongs_to :immeuble |
dans mon formulaire immeuble (_form avec simple_form), j'ajoute les pièces 1 à 1 via ajax
Code:
1 2 3 4
| <%= f.simple_fields_for :liste_pieces do |builder| %>
<%= render "liste_pieces/form", :f => builder %>
<% end %>
<p><%= link_to_add_fields "Ajouter une pièce", f, :liste_pieces %></p> |
ma méthode link_to_add_fields vient de railscast (avec Jquery) :
Code:
1 2 3 4 5 6 7
| def link_to_add_fields(name, f, association)
new_object = f.object.class.reflect_on_association(association).klass.new
fields = f.simple_fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
render(association.to_s + "/form", :f => builder)
end
link_to_function(name, "add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")", :class => "ajout")
end |
donc dans l'appli quand je clique sur "ajouter", j'ai bien mon _form de liste_piece qui apparait, mais la liste des pièces n'est pas sauvée.
mon controleur immeuble_controller :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| def new
@immeuble = @dossier.immeubles.new
@immeuble.liste_pieces.build
end
def create
@immeuble = @dossier.immeubles.new(params[:immeuble])
if @immeuble.save
redirect_to dossier_immeubles_path, :notice => "trop bien le nouvel immeuble"
else
render :action => 'new'
end
end
def edit
@immeuble = @dossier.immeubles.find(params[:id])
end
def update
@immeuble = @dossier.immeubles.find(params[:id])
if @immeuble.update_attributes(params[:immeuble])
redirect_to dossier_immeubles_path, :notice => "immeuble correctement ravalé ou modifié"
else
render :action => 'edit'
end
end (...) |
Quand je crée ne piece sur un formulaire vierge, seule la première est enregistrée (suite au build, je pense)
le java génére bien les cases avec le code genre :
Code:
<select name="immeuble[liste_pieces_attributes][1301342876551][piece]" id="immeuble_liste_pieces_attributes_1301342876551_piece" class="select optional">
quand je passe en console, un simple :
@immeuble = Immeuble.last
@immeuble_liste_pieces_attributes = [{ :piece => 'salon' .......}]
génére bien une piece de plus dans l'immeuble (qui apparait dans l'appli au refresh) et je peux la modifier, cela est pris en compte.
Je n'ai aucun message d'erreurs ou de trucs pour me guider.
Dans le terminal, il semble que les bout de formulaire créé avec ajax ne soit pas pris en compte :
si j'ai 2 pièces créées en console, j'en ajoute une 3eme dans l'appli, je n'ai que :
Code:
Parameters: {"commit"=>"Modifier ce Immeuble", "authenticity_token"=>"DlFTOp1Vtyua9UJPkARdfHcHKIoy/i12IRVH2m7/K2k=", "utf8"=>"✓", "dossier_id"=>"2", "id"=>"7", "immeuble"=>{"nb_piece_princ"=>"5", "liste_pieces_attributes"=>{"0"=>{"id"=>"3", "piece"=>"4",_destroy"=>"false"}, "1"=>{"id"=>"4", "piece"=>"4", "_destroy"=>"false"}}
bref que 2 !!
Quelqu'un voit ou se situe mon problème ? parce-que là, je seche.
Avec tous mes remerciements à mon sauveur.