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 :

Liste déroulante avec contenu dynamique


Sujet :

Ruby on Rails

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 18
    Par défaut Liste déroulante avec contenu dynamique
    Bonsoir,

    j'ai créé une petite application pour un jeu d'avion.
    Le but est d'associé des avions à des lignes.
    Lors de la création de mon modèle, j'ai fait un champ Constructeur et un champ Modele pour le Model Avion.
    Pour le Model Ligne, j'ai fait un champ paysdepart, villedepart, paysarrivee, villearrivee.

    J'ai enfin un dernier Model, ligneutilisee, qui associe grosso modo un avion_id avec un ligne_id.
    Ce que j'aimerais faire, c'est un menu déroulant des constructeurs qui permette de choisir le modèle d'avion (qui lui donnera le avion_id).
    Je voudrais aussi avoir une liste déroulante pour choisir le pays de départ, qui remplis automatiquement une liste déroulante de ville de départ. Une fois celà fait, il faut faire la même chose avec le couple pays/ville arrivée, sachant que c'est pas un "full mesh" et donc que ce coupe est restreint par le choix du pays/ville de départ.

    Est-ce facilement faisable ?
    Sinon, peux-ton mettre dans le même menu déroulant deux champs d'un même enregistrement ? (Menu déroulant Constructeur - Modèle )

    Merci d'avance pour les réponses, j'ai cherché sur le Net mais j'ai pas trouvé...

  2. #2
    Membre expérimenté
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Par défaut
    Bonjour

    Ce que tu souhaites faire est assez facile, il suffit d'un observe_fiels, qui se charge lors du changement de valeurs d'un champs d'aller récupérer les informations nécessaires pour en remplir un second.

    Tu en trouveras un (bon ?) exemple là :

    http://pbnaigeon.developpez.com/tuto...cile-RJS/#LV-A
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 18
    Par défaut
    Bonjour et merci pour la réponse.
    J'avais déjà vu le tutoriel. Mon problème est que les deux listes déroulantes viennent du même Model, donc du même controller. J'arrive donc pas en gros à donner que les valeurs pour le deuxième champ.
    COilà ce que j'ai mis dans le new.html.erb :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        <b>Avion</b><br />
     
        <%= select("", "Avion", @liste_avion.collect {|c| [c.constructeur, c.id] }) %>
        <%= image_tag "ajax-loader.gif", :id=>"wait_icon", :style=>"display:none" %>
        <%= select("Ligneutilisee", "Avion", @liste_avion.collect {|c| [c.modele, c.id] }) %>
     
     
    <%= observe_field '_Avion',
                :update=>'Ligneutilisee_Avion',
                :url => {:controller => 'ligneutilisees', :action => 'update_modele'},
                :before => "Element.toggle('wait_icon')",
                :complete => "Element.toggle('wait_icon')",
                :with => "'constructeur=' + escape(value)"
    %>
    dans le fichier update_modele.rjs (au même endroit dans l'arborescense), j'ai mis cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # On commence par supprimer le contenu de "profile_departement"
    page.replace_html "Ligneutilisee_Avion", ""
     
    # Puis on le remplit avec les nouvelles valeurs
    @liste_avion.each { |avion|
      page.insert_html :bottom,
          "Ligneutilisee_Avion",
          content_tag('option', avion.modele, :value => avion.constructeur )
    }
    Enfin dans ligneutilisees_controller.erb, j'ai mis ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def update_modele
        choix_constructeur = params['constructeur']
        @liste_modele = Avion.find_all_by_constructeur(choix_constructeur, :order => "modele asc")
      end
    j'avoue que je pense avoir compris le rjs (c'est quand même simple ) mais moins comment interragissez les trois fichiers...

  4. #4
    Membre expérimenté
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Par défaut
    ce que tu as mis me semble correct, mais je ne comprends pas quel est ton problème exactement. Je te poste dans la matinée un exemple qui te fera exactement ce que tu souhaites

    PS : en passant, plutôt que de t'embêter à remplir ta liste déroulante, je passerai directement par un partial

    PS bis : avoir et tes constructeurs, et tes modèles dans une même table, ça me semble tout de même space... tu es sûr que ton modèle de données est bien normalisé ? (même si le soucis viens pas de là)
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 18
    Par défaut
    D'abord, pour éviter les confusions dues aux noms des mes colonnes de la table Avion, constructeurs et modèles sont deux attributs d'un avion parmi d'autres (prix, vitesse, ...). Dans la suite du sujet, je les appelerais constAvion et modeleAvion (je me perds entre eux et les constructeurs/modèles de RoR )

    Maintenant, mon problème par un exemple :
    J'ai trois Avions : un Douglas DC-3, un Douglas DC-2 et un Boeing 307.

    Lorsque je crée une instance "Ligne Utilisée", qui mappe une Ligne (Point A vers Point B) et un avion, je voudrais choisir l'avion_id.
    Je choisis donc dans une liste déroulante d'abord le constAvion, seulement pour filtrer dans une deuxième liste déroulante les modeleAvion adéquat (DC-3 et DC-2 pour Douglas par exemple). Cette deuxième liste déroulante permet de choisir l'avion_id.

    Est-ce plus clair ?
    j'ai peut être mal fait le modèle (en fait j'aurais du mettre une table constructeurAvion et une table Pays mais bon...) en effet mais c'est pour moi un moyen d'appréhender RoR et Ruby par un petit projet

    Merci en tout cas pour tes réponses !

  6. #6
    Membre expérimenté
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Par défaut
    Alors, de ce que j'en ai compris :

    controlleur (ligneutilisees):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    def index
       @constructeur = Avion.find(:all).map{ |elt| [elt.constructeur, elt.constructeur]}
    end
     
    def update_modele_field
       constructeur = params['constructeur']
       @modele = Avion.find(:all, :conditions=>['constructeur = ?', constructeur]).map{ |elt| [elt.modele, elt.id]}
       render :partial => "update_modele_field"
    end
    Vue : (index.rhtml)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <%= select("avion", "constructeur", @constructeur) %>
    <%= image_tag "ajax-loader.gif", :id=>"wait_icon", :style=>"display:none" %>
     
    <%= observe_field 'avion_'constructeur,
                :update=>'modele_field',
                :url => {:controller => 'ligneutilisees', :action => 'update_modele_field'},
                :before => "Element.toggle('wait_icon')",
                :complete => "Element.toggle('wait_icon')",
                :with => "'constructeur=' + escape(value)"
    %>
     
    <div id="modele_field">&nbsp;</div>
    partial (_update_modele_field.rhtml) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <%= select("avion", "modele", @modele) %>
    Mais le soucis avec ton modèle actuel, c'est quand que tu récupère un constructeur, l'id que tu récupère n'est pas un id de constructeur, mais bel et bien un id d'avion... ce qui pose donc pas mal de soucis (être obligé de rechercher par intitulé et non par id, devoir dans l'idéal faire un distinct, ...).

    Bref, à ta place, je reverrai les choses, à savoir faire une table constructeur, une table modèle, et une table avion, avec un constructeur_id et un modele_id (rien n'empêche à priori d'avoir plusieurs avions du même constructeur et ayant le même modèle, je suppose qu'alors seule "l'immatriculation" les distinguerai)
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 18
    Par défaut
    Bonsoir,
    j'ai décidé de redémarrer à zéro et de créer plus de modèles pour rendre le programme mieux défini.

    Après création, il semble que certaines choses sont impossible :
    • nommer un Model constructeur_avion ou constructeurAvion (seul constructeuravion "marche"). Par contre pas de problème pour nomme une colonne ville_arrivee (mais villeArrivee ne marche pas non plus)
    • nommer un Model pays (je suppose à cause du s)


    Autant le dernier c'est pas trop grave (il n'y a "qu'à" faire une faute d'orthographe ), autant le premier ça m'embête pour des raisons de lisibilité.
    Est-ce moi ou est-ce RoR ?

    Deuxième question, j'ai un Model ville et un Model Ligne. La ligne a deux villes (départ et arrivée). quand il n'y en a qu'un, je mets t.references:ville (par exemple), mais quand il y en a deux, comment expliquer les liens (belongs_to ?)

    Dès que j'aurais réessayé, je tente l'exemple que tu m'as donné en l'adaptant

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Par défaut
    Salut,

    Au lieu de dire que "c'est impossible" (ou "ça ne marche pas"), il faut que tu sois plus précis sur le problème exact que tu rencontre : ce que tu as essayé précisement, les messages d'erreurs que tu obtiens, etc.

    Par convention en Ruby une classe est toujours de la forme MaClasse et un champ de la forme mon_champ. Tu peux avoir des problèmes avec les pluriels en français, car Rails se base sur des noms anglais. Je te renvoie à la FAQ pour contourner ce problème :
    Comment vérifier le pluriel que Rails prend en compte pour un mot tel que "cheval" ou "man"
    Comment profiter des conventions de rails sur un pluriel 'français'


    Pour avoir deux références sur une autre table, il suffit de créer les deux champs et spécifier les deux belongs_to :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Schema:
    t.references :depart
    t.references :arrivee
     
    Model:
    belongs_to :depart, :class_name => 'Ville'
    belongs_to :arrivee, :class_name => 'Ville'

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 18
    Par défaut
    Quand je dis que c'est impossible, c'est que j'ai ceci comme retour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    undefined method `constructeur_avion' for #<ModeleAvion:0x5789f3>
    lorsque je veux créer un nouveau modele_avion qui a un champ constructeur_avion en référence (t.references:constructeur_avion)

    merci pour le tip des villes

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 18
    Par défaut
    Bonjour à tous,
    pour vous tenir au courant, j'ai complètement changé mon modèle et j'ai recommencé
    j'ai pu utiliser l'exemple de titoumimi (entre deux Model ) et ça marche (après que j'ai ouvert les yeux)

    j'ai un autre problème maintenant mais je vais faire un autre sujet

    Merci beaucoup en tout cas

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

Discussions similaires

  1. Liste déroulante avec contenu contraint
    Par jeje644 dans le forum Excel
    Réponses: 2
    Dernier message: 15/10/2014, 22h58
  2. Liste Déroulante avec filtration dynamique
    Par Michel11100 dans le forum IHM
    Réponses: 2
    Dernier message: 23/04/2013, 22h58
  3. [AC-2010] liste déroulante avec contenu variable
    Par fomy dans le forum IHM
    Réponses: 3
    Dernier message: 08/12/2012, 18h29
  4. Réponses: 3
    Dernier message: 09/01/2009, 10h23
  5. Liste déroulante avec mise à jour champ en dynamique
    Par B-Pascal dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 05/07/2006, 15h53

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