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 :

[RJS] mise à jour ajax sur un groupe de checkbox


Sujet :

Ruby on Rails

  1. #1
    Membre du Club
    Profil pro
    Webmaster
    Inscrit en
    Décembre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Décembre 2006
    Messages : 50
    Points : 55
    Points
    55
    Par défaut [RJS] mise à jour ajax sur un groupe de checkbox
    Hello

    Un petit soucis avec une liste de checkbox permettant de gérer une relation N-N dans la BDD...

    La liste étant assez longue, j'ai un champ texte avec un observe_field pour filtrer la liste dynamiquement en ajax avec un "render partial" dans mon controller

    le soucis est que le rechargement de la liste ne conserve pas les cases préalablement cocher...

    Une solution serait de mettre à jour dynamiquement la BDD à chaque fois que l'on coche/décoche une case, mais je ne vois pas trop comment mettre un observe_field sur les boxs car qu'elles ont toutes le meme id :

    <% for r in @checkboxliste %>
    <%= check_box_tag('refr[]', r.id, @requete.checkbox.include?(r)) + r.nom %>
    <% end %>

    @checkboxliste et @requete pointe sur les 2 tables en relation N-N

    Si quelqu'un a une id, je suis preneur...

    Merci d'avance.
    Gyome.

  2. #2
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par gyome314
    mais je ne vois pas trop comment mettre un observe_field sur les boxs car qu'elles ont toutes le meme id

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <% for r in @checkboxliste %>
    <%= check_box_tag('refr[]', r.id, @requete.checkbox.include?(r)) + r.nom %>
    <% end %>
    Je ne comprends pas ta phrase, en regardant ton code en quoi les check box ont le meme id ?

    Sache qu'en html il est interdit d'avoir deux éléments avec le meme id...

  3. #3
    Membre du Club
    Profil pro
    Webmaster
    Inscrit en
    Décembre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Décembre 2006
    Messages : 50
    Points : 55
    Points
    55
    Par défaut
    bah le souci c'est que dans la boucle for, ruby ne génère les checkbox à la volée, en leur attribuant à toutes le même identifiant qui se trouve être le premier paramètre de la fonction check_box_tag : refr[]...

    C'est aussi le moyen de passer en paramètres un tableau contenant directement les valeurs cochées.

    Maintenant, il y a probablement un autre moyen de faire, c'est un bout de code que j'ai récupéré pour gérer simplement les relations N-N.

  4. #4
    Membre du Club
    Profil pro
    Webmaster
    Inscrit en
    Décembre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Décembre 2006
    Messages : 50
    Points : 55
    Points
    55
    Par défaut Solution
    Avec un peu de persévérence, j'ai trouvé la solution que je cherchais depuis quelques jours...

    J'ai remplacer ma boucle for par celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <% for r in @checkboxsliste %>
        <input id="refr" name="refr[]" type="checkbox" value="<%= r.id %>"
        <%= "checked" if @requete.checkbox.include?(r) %>
        onclick = "
        <%= remote_function :update => 'table',
             :before => "Element.show('spinner')",
             :success => "Element.hide('spinner')",
             :url => {:action => 'reload', :id => @requete},
             :with => 'newcb=#{r.id}' %>
        "/>
        <%= r.nom + "<br />" %>
    <% end %>
    l'action reload de mon controller, traite le paramètre newcb, pour savoir s'il appartient ou non à la relation est fait un render partial sur la liste...

    Et effectivement, pour fait les choses proprement, je vais faire en sorte que les id de mes checkbox ne soient pas tous les mêmes avec un indice de boucle...

    Merci, A+

  5. #5
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par gyome314
    bah le souci c'est que dans la boucle for, ruby ne génère les checkbox à la volée, en leur attribuant à toutes le même identifiant qui se trouve être le premier paramètre de la fonction check_box_tag : refr[]...
    En effet, j'avais bien mal lu le code...
    Donc si tu fais un truc comme ça (non testé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <% for r in @checkboxliste %>
    <%= check_box_tag('refr[]', r.id, @requete.checkbox.include?(r), { :id => 'refr_'+r.id } ) + r.nom %>
    <% end %>
    ça devrait te générer des id uniques...

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 652
    Points
    652
    Par défaut
    Puisque tu as l'air en plein dedans, gyome314, je voudrais te demander de bien vouloir tester le cas où toutes les cases sont décochées, et me dire si tu ne remarques rien...
    Merci d'avance.
    C'est pour voir si tu arrives aux meme conclusions que moi

  7. #7
    Membre du Club
    Profil pro
    Webmaster
    Inscrit en
    Décembre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Décembre 2006
    Messages : 50
    Points : 55
    Points
    55
    Par défaut
    Je décoche, je décoche, mais je vois rien de particulier...

    Tu m'inquiètes, j'ai fait pas mal de tests, et ca tourne comme je le voulais.

    Je suis passé à coté de quelque chose ?

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 652
    Points
    652
    Par défaut
    Il semblerait que lorsque toutes les cases sont décochées, l'objet "params" n'est plus renvoyé au controleur...
    Dommage pour un update

    Si tu veux bien essayer :
    Crée un enregistrement avec 1 case cochée, et sauvegarde le.
    Ensuite, rappelle ton enregistrement pour décocher, et voit si il sauvegarde bien cette derniere décoche. ( Meme si il te dit qu'il l'a fait, il ne le fait pas ).

    Si tu n'as pas ce soucis, c'est que ta technique contourne ce probleme, et c'est cool

  9. #9
    Membre du Club
    Profil pro
    Webmaster
    Inscrit en
    Décembre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Décembre 2006
    Messages : 50
    Points : 55
    Points
    55
    Par défaut
    En fait, le onclick fait appel à l'action du controller lorsqu'on coche et aussi lorsqu'on décoche la checkbox...

    ensuite, je vérifie dans mon crotroleur si l'id renvoyé à appartient à la relation N-N...
    Si oui, on l'enlève, car ca veut dire qu'on a décoché, si non, on le rajoute...

  10. #10
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 652
    Points
    652
    Par défaut
    Ca m'a l'air hyper bien ta technique ("remote_fonction" sur evenement...)
    (d'autant que tu évites le bug du "param" vide)
    Merci en tout cas d'avoir exposé ton travail, je pense que je vais m'en inspirer un jour ou l'autre
    Ca t'ennuierait de montrer le code de ton controleur s'il te plait ?
    ( Pas tout, juste la méthode qui fait le update )
    Merci d'avance

  11. #11
    Membre du Club
    Profil pro
    Webmaster
    Inscrit en
    Décembre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Décembre 2006
    Messages : 50
    Points : 55
    Points
    55
    Par défaut
    pas de soucis, si ca peut reservir :

    donc mes checks box sont la :

    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
    <%
        i = 0
        for r in @checkboxliste
    %>    
    <input id="refr<%= i %>" name="refr[]" type="checkbox" value="<%= r.id %>" <%= "checked" if @requete.rom.include?(r) %>
    onclick = "
    <%= remote_function :update => 'table',
             :before => "Element.show('spinner')",
             :success => "Element.hide('spinner')",
             :url => {:action => 'reload_checkbox', :id => @requete},
             :with => "'newcb=#{r.id}'" %>
        "/>
    <%= r.rom + "<br />" %>
    <% i += 1 %>
    <% end %>
    Ce code et contenu dans un fichier _cb.rhtml qui est rendu dans une div "table"
    Le spinner est une petite image de chargement...

    et voici l'action de mon controller qui met à jour les relation entre les tables 'requetes' et 'checkboxs'
    (les modéles sont définis avec des relations has_and_belongs_to_many, et une table implicite 'requetes_checkboxs' fait la correspondance entre les ids)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def reload_checkbox
        @requete = Requete.find(params[:id])
        @checkboxliste = Checkbox.find(:all)
        if params[:newcb] != nil
            r = Checkbox.find(params[:newcb])
            if @requete.checkbox.include?(r)
                @requete.checkbox.delete(r)
            else
                @requete.checkbox.<<(r)
            end
        end
        render :partial => "cb", :layout => false
    end
    Voila, j'espère que c'est suffisemment clair pour être réutilisé

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mise a jours Univers sur B.O XI R3
    Par unicefr dans le forum Administration-Migration
    Réponses: 4
    Dernier message: 24/04/2012, 13h05
  2. mise a jour somme sur dataset filtré
    Par Le Lézard dans le forum Bases de données
    Réponses: 5
    Dernier message: 01/02/2009, 19h27
  3. Mise a jour automatique sur excel?
    Par fredieuric dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/12/2006, 12h41

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