IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ruby on Rails Discussion :

[RoR3] nested complex forms


Sujet :

Ruby on Rails

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 32
    Points : 25
    Points
    25
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    <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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    Montre les logs du POST

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    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

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    personne, vraiment
    cela n'est jamais arrivé à aucun de vous ?

Discussions similaires

  1. Complex forms et duplication
    Par spull dans le forum Ruby on Rails
    Réponses: 0
    Dernier message: 30/01/2009, 19h09
  2. Réponses: 1
    Dernier message: 19/02/2007, 12h45
  3. Mise en forme complexe d'images
    Par Yoshidu62 dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 2
    Dernier message: 14/06/2006, 17h28
  4. [8i][forms 6i] nested table
    Par Magnus dans le forum Oracle
    Réponses: 2
    Dernier message: 12/01/2006, 10h22
  5. [LG]Nombres complexes et forme polaire
    Par chavernac dans le forum Langage
    Réponses: 3
    Dernier message: 28/03/2005, 18h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo