+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Invité de passage
    Inscrit en
    mars 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 32
    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.

  2. #2
    Membre confirmé 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 : 276
    Points
    276

    Par défaut

    Montre les logs du POST

  3. #3
    Invité de passage
    Inscrit en
    mars 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 32
    Points : 2
    Points
    2

    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
    Invité de passage
    Inscrit en
    mars 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 32
    Points : 2
    Points
    2

    Par défaut

    personne, vraiment
    cela n'est jamais arrivé à aucun de vous ?

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •