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 :

Partager des variables entre plusieurs actions ds un controlleur


Sujet :

Ruby on Rails

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 87
    Points
    87
    Par défaut Partager des variables entre plusieurs actions ds un controlleur
    Bonjour à tous,

    Lorsque j'édite le code d'un fichier app/controllers/xxx_controller.rb, je fais appel à des variables ou des portions de code qui sont communes à plusieurs vues.

    Par exemple des variables récupérant les valeurs de paramêtres. Et surtout des transformations effectuées sur ces variables avant de les transmettre à des requêtes SQL.

    Je pensais pouvoir les placer en début de fichier, avant les blocs 'def index .. end', etc. mais ça ne marche pas.

    Pour ne pas ré-écrire dans chaque vue ce code, comment procéder pour qu'il soit partagé par toutes ?

    Merci d'avance,

    g.

  2. #2
    Membre éprouvé

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

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

    Tu peux factoriser du code dans ton contrôleur en créant des méthodes privées, par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class SearchController < ApplicationController
      def users
        @list = User.find :all, :conditions => conditions_from_params
      end
      def posts
        @list = Post.find :all, :conditions => conditions_from_params
      end
     
     private
      def conditions_from_params
        # transformation des params en SQL ...
      end 
    end
    ou même avec before_filter :
    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
    class SearchController < ApplicationController
     
      before_filter :create_sql
     private
      def create_sql
        @sql = ... # creation d'une requete SQL ...
      end 
     
     public
      # la variable @sql est disponible pour toutes les actions
      def users
        ...
      end
      def posts
        ...
      end
     
    end
    Attention a ne pas oublier de mettre les méthodes qui ne sont pas des actions (pas accessible par l'url en gros) en private

    Je sais pas si mes exemples sont très parlants, sinon montre nous ton code ça sera le plus simple je crois
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par Taum Voir le message
    Salut,

    Je sais pas si mes exemples sont très parlants, sinon montre nous ton code ça sera le plus simple je crois
    Je crois aussi, je débute, là...

    Bon, par exemple j'ai deux actions index et recherche qui débutent exactement de la même manière:

    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
    27
    28
    29
    30
    31
    32
    class MembresController < ApplicationController
     
      def index
     
        @exercices  = params[:exercices]
     
        @conditions=["membre=1"]
     
        @tous_les_exercices = []
        for exercice in Role.tous_les_exercices
          @tous_les_exercices.push(exercice.annee)
        end  
     
        # (du code...)
     
      end  
     
      def recherche
     
        @exercices  = params[:exercices]
     
        @conditions=["membre=1"]
     
        @tous_les_exercices = []
        for exercice in Role.tous_les_exercices
          @tous_les_exercices.push(exercice.annee)
        end  
     
        # (encore du code...)
     
      end
    end
    Est-ce qu'on ne peut pas reporter ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @exercices  = params[:exercices]
     
    @conditions=["membre=1"]
     
    @tous_les_exercices = []
    for exercice in Role.tous_les_exercices
        @tous_les_exercices.push(exercice.annee)
    end
    en dehors de ces 2 blocs, de manière à ne l'écrire qu'une fois, sachant que j'utiliserai dans ces blocs les variables @exercices, @conditions et @tous_les_exercices

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    Comme l a dis Taum utilise le callback before_filter pour la methode index et recherche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    before_filter :machin, :only=>[:index,:recherche]
     
    def machin
     
    @exercices  = params[:exercices]
     
    @conditions=["membre=1"]
     
    @tous_les_exercices = []
    for exercice in Role.tous_les_exercices
        @tous_les_exercices.push(exercice.annee)
    end
    end

  5. #5
    Membre éprouvé

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    Notes aussi que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @tous_les_exercices = []
    for exercice in Role.tous_les_exercices
        @tous_les_exercices.push(exercice.annee)
    end
    S'écrit en Ruby :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @tous_les_exercices = Role.tous_les_exercices.collect { |e| e.annee }
    Voire même grâce aux ajouts apportés par Rails :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @tous_les_exercices = Role.tous_les_exercices.collect(&:annee)
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par Taum Voir le message
    Notes aussi que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    @tous_les_exercices = []
    for exercice in Role.tous_les_exercices
        @tous_les_exercices.push(exercice.annee)
    end
    S'écrit en Ruby :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @tous_les_exercices = Role.tous_les_exercices.collect { |e| e.annee }
    De l'inconvénient d'être passé par Perl Merci pour ce genre de conseil qui corrige les mauvaises pratiques.

    Il n'est donc pas nécessaire de déclarer au préalable l'objet @tous_les_exercices comme une Array vide ?

  7. #7
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    Citation Envoyé par gvdmoort Voir le message
    Il n'est donc pas nécessaire de déclarer au préalable l'objet @tous_les_exercices comme une Array vide ?
    non, ce n'est pas la peine, il s'initialisera au passage (le collect ou le map renvoient des tableaux, et vive le duck-typing )
    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

Discussions similaires

  1. Partager une variable entre plusieurs classes
    Par jasonpolakow dans le forum Windows Forms
    Réponses: 8
    Dernier message: 06/01/2011, 10h02
  2. Partager des variables entre Threads
    Par ToTo13 dans le forum Concurrence et multi-thread
    Réponses: 7
    Dernier message: 01/04/2010, 16h09
  3. vb.net : Partage des variables entre forms
    Par House MD dans le forum VB.NET
    Réponses: 5
    Dernier message: 13/03/2008, 22h46
  4. [Portlet] Partager des objest entre plusieurs Portlet
    Par sammm dans le forum Portails
    Réponses: 4
    Dernier message: 16/01/2007, 13h35
  5. Partage de variables entre plusieurs pages
    Par bud_gw dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 27/12/2005, 15h42

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