Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > Ruby > Ruby on Rails
Ruby on Rails Le forum sur le framework Ruby on Rails. Voir aussi la FAQ RoR et les cours RoR.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 28/03/2011, 22h17   #1
pasqal
Invité de passage
 
Inscription : mars 2007
Messages : 31
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 31
Points : 2
Points : 2
Par défaut [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"=>"&#10003;", "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.
pasqal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 09h43   #2
Gregory.M
Membre confirmé
 
Avatar de Gregory.M
 
Inscription : novembre 2007
Messages : 684
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2007
Messages : 684
Points : 260
Points : 260
Montre les logs du POST
Gregory.M est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 20h53   #3
pasqal
Invité de passage
 
Inscription : mars 2007
Messages : 31
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 31
Points : 2
Points : 2
désolé de débarquer maintenant, mais je ne bosse là dessus que la nuit...

Pour les logs, je mets cela, c'est OK?

Started POST "/dossiers/1/immeubles" for 127.0.0.1 at Tue Mar 29 20:44:54 +0200 2011
Processing by ImmeublesController#create as HTML
Parameters: {"commit"=>"enregistrer", "authenticity_token"=>"DlFTOp1Vtyua9UJPkARdfHcHKIoy/i12IRVH2m7/K2k=", "utf8"=>"✓", "dossier_id"=>"1", "immeuble"=>{"nb_piece_princ"=>"1", "liste_pieces_attributes"=>{"0"=>{"genere_EU"=>"1", "details"=>"etage", "surface"=>"12", "piece"=>"4", "est_piece_princ"=>"0", "_destroy"=>"false"}}, "type_habitat"=>"oui", "annee_constr"=>"1900", "compteurs_attributes"=>{"0"=>{"ref_compteur"=>"", "conso_moyenne"=>"", "commentaire"=>"", "_destroy"=>"false", "declare"=>"0", "type_alimentation"=>"", "analyse_OK"=>"0"}}, "commentaire"=>"commentaires", "users_attributes"=>{"0"=>{"fonction"=>"1", "username"=>"user name", "mails_attributes"=>{"0"=>{"_destroy"=>"false", "type_mail"=>"", "email"=>""}}, "date_arrivee"=>"2001", "adresses_attributes"=>{"0"=>{"numero_rue"=>"58", "type_adresse"=>"6", "commune"=>"blable", "_destroy"=>"false", "code_postal"=>"25896", "contenu"=>"eeeee"}}, "phones_attributes"=>{"0"=>{"_destroy"=>"false", "numero"=>"", "type_phone"=>""}}}}, "taux_occupation"=>"100", "adresses_attributes"=>{"0"=>{"numero_rue"=>"59", "commune"=>"trucmuche", "code_postal"=>"58250", "contenu"=>"rue de blalvla", "princ"=>"1"}}, "parcelles_attributes"=>{"0"=>{"section"=>"ZY", "surface"=>"2158", "_destroy"=>"false", "numero"=>"288"}}}}
SQL (1.3ms) SELECT name
FROM sqlite_master
WHERE type = 'table' AND NOT name = 'sqlite_sequence'

SQL (0.4ms) SELECT name
FROM sqlite_master
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
Dossier Load (0.2ms) SELECT "dossiers".* FROM "dossiers" WHERE "dossiers"."id" = 1 ORDER BY reference LIMIT 1
AREL (11.1ms) INSERT INTO "immeubles" ("nb_eq_hab_max", "annee_renov", "commentaire", "created_at", "type_habitat", "updated_at", "nb_eq_hab_min", "taux_occupation", "annee_constr", "dossier_id", "nb_piece_princ") VALUES (NULL, NULL, 'commentaires', '2011-03-29 18:44:55.113771', 'oui', '2011-03-29 18:44:55.113771', NULL, '100', '1900', 1, 1)
AREL (0.1ms) INSERT INTO "liste_pieces" ("immeuble_id", "genere_EU", "piece", "surface", "details", "created_at", "updated_at", "est_piece_princ") VALUES (8, 't', '4', 12, 'etage', '2011-03-29 18:44:55.171005', '2011-03-29 18:44:55.171005', 'f')
AREL (0.1ms) INSERT INTO "parcelles" ("section", "immeuble_id", "updated_at", "created_at", "surface", "numero") VALUES ('ZY', 8, '2011-03-29 18:44:55.173301', '2011-03-29 18:44:55.173301', 2158, 288)
AREL (0.1ms) INSERT INTO "users" ("email", "password_hash", "date_arrivee", "commentaire", "immeuble_id", "created_at", "updated_at", "password_salt", "username", "photo", "destinataire", "groupe_id", "fonction") VALUES (NULL, NULL, NULL, NULL, 8, '2011-03-29 18:44:55.175333', '2011-03-29 18:44:55.175333', NULL, 'user name', NULL, NULL, NULL, 1)
AREL (0.1ms) INSERT INTO "adresses" ("adressable_type", "updated_at", "contenu", "adressable_id", "princ", "created_at", "commune", "immeuble_id", "code_postal", "numero_rue", "type_adresse") VALUES ('User', '2011-03-29 18:44:55.177657', 'eeeee', 4, NULL, '2011-03-29 18:44:55.177657', 'blable', NULL, 25896, 58, 6)
AREL (0.1ms) INSERT INTO "adresses" ("adressable_type", "updated_at", "contenu", "adressable_id", "princ", "created_at", "commune", "immeuble_id", "code_postal", "numero_rue", "type_adresse") VALUES ('Immeuble', '2011-03-29 18:44:55.180300', 'rue de blalvla', 8, 't', '2011-03-29 18:44:55.180300', 'trucmuche', NULL, 58250, 59, NULL)
Redirected to http://localhost:3000/dossiers/1/immeubles
Completed 302 Found in 303ms


Sinon j'ai fait un debug sur mon form:

--- !ruby/object:Immeuble
adresses:
- !ruby/object:Adress
attributes:
adressable_type: Immeuble
numero_rue:
created_at:
type_adresse:
commune:
updated_at:
immeuble_id:
code_postal:
princ:
contenu:
adressable_id:
attributes_cache: {}

changed_attributes:
adressable_type:
destroyed: false
errors: !omap []

marked_for_destruction: false
new_record: true
previously_changed: {}

readonly: false
attributes:
nb_eq_hab_min:
created_at:
nb_piece_princ:
updated_at:
dossier_id: 1
annee_constr:
type_habitat:
commentaire:
annee_renov:
nb_eq_hab_max:
taux_occupation:
attributes_cache: {}

changed_attributes:
dossier_id:

liste_pieces:
- !ruby/object:ListePiece
attributes:
genere_EU:
created_at:
details:
updated_at:
immeuble_id:
surface:
est_piece_princ:
piece:
attributes_cache: {}

changed_attributes: {}

destroyed: false
errors: !omap []

marked_for_destruction: false
new_record: true
previously_changed: {}

readonly: false
marked_for_destruction: false
new_record: true

----
dans ce cas, je n'ai pas de souci, la première, et seulement la première pièces est bien enregistrer
mais si je modifie :

Started POST "/dossiers/1/immeubles/8" for 127.0.0.1 at Tue Mar 29 20:47:52 +0200 2011
Processing by ImmeublesController#update as HTML
Parameters: {"commit"=>"enregistrer", "authenticity_token"=>"DlFTOp1Vtyua9UJPkARdfHcHKIoy/i12IRVH2m7/K2k=", "utf8"=>"✓", "dossier_id"=>"1", "id"=>"8", "immeuble"=>{"nb_piece_princ"=>"1", "liste_pieces_attributes"=>{"0"=>{"genere_EU"=>"1", "details"=>"etage", "surface"=>"12", "id"=>"5", "piece"=>"4", "est_piece_princ"=>"0", "_destroy"=>"false"}}, "type_habitat"=>"oui", "annee_constr"=>"1900", "commentaire"=>"commentaires", "users_attributes"=>{"0"=>{"fonction"=>"1", "username"=>"user name", "id"=>"4", "date_arrivee"=>"", "adresses_attributes"=>{"0"=>{"numero_rue"=>"58", "type_adresse"=>"6", "commune"=>"blable", "id"=>"9", "_destroy"=>"false", "code_postal"=>"25896", "contenu"=>"eeeee"}}}}, "taux_occupation"=>"100", "adresses_attributes"=>{"0"=>{"numero_rue"=>"59", "commune"=>"trucmuche", "id"=>"10", "code_postal"=>"58250", "contenu"=>"rue de blalvla", "princ"=>"1"}}, "parcelles_attributes"=>{"0"=>{"section"=>"ZY", "surface"=>"2158", "id"=>"4", "_destroy"=>"false", "numero"=>"288"}}}}
SQL (0.8ms) SELECT name
FROM sqlite_master
WHERE type = 'table' AND NOT name = 'sqlite_sequence'

Dossier Load (0.2ms) SELECT "dossiers".* FROM "dossiers" WHERE "dossiers"."id" = 1 ORDER BY reference LIMIT 1
Immeuble Load (0.2ms) SELECT "immeubles".* FROM "immeubles" WHERE "immeubles"."id" = 8 AND ("immeubles".dossier_id = 1) LIMIT 1
ListePiece Load (0.2ms) SELECT "liste_pieces".* FROM "liste_pieces" WHERE "liste_pieces"."id" IN (5) AND ("liste_pieces".immeuble_id = 8)
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" IN (4) AND ("users".immeuble_id = 8)
Adress Load (0.2ms) SELECT "adresses".* FROM "adresses" WHERE "adresses"."id" IN (9) AND ("adresses".adressable_id = 4 AND "adresses".adressable_type = 'User')
Parcelle Load (0.2ms) SELECT "parcelles".* FROM "parcelles" WHERE "parcelles"."id" IN (4) AND ("parcelles".immeuble_id = 8)
Adress Load (0.2ms) SELECT "adresses".* FROM "adresses" WHERE "adresses"."id" IN (10) AND ("adresses".adressable_id = 8 AND "adresses".adressable_type = 'Immeuble')
Redirected to http://localhost:3000/dossiers/1/immeubles
Completed 302 Found in 167ms

-idem que le 1er alors que j'ai ajouté des pièces !! J'ai oublié de préciser que cela le fait sur tous les autres "formulaires" de mon formulaire immeuble.

J'ai réinstalle jquery, virer les attr_accessible pour être sûr... mais rien
merci pour l'aide
pasqal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 12h15   #4
pasqal
Invité de passage
 
Inscription : mars 2007
Messages : 31
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 31
Points : 2
Points : 2
personne, vraiment
cela n'est jamais arrivé à aucun de vous ?
pasqal est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h33.


 
 
 
 
Partenaires

Hébergement Web