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 :

[débutant] Créer une nouvelle méthode pour un objet


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 [débutant] Créer une nouvelle méthode pour un objet
    Bonjour à tous,

    J'aurais besoin de vos lumières pour comprendre comment créer une méthode.

    Soit un projet RoR où j'ai une table personnes avec des champs id, nom, prenom, etc.

    Dans un controleur, si j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @personne = Personne.find(params[:id])
    Je peux utiliser dans une vue @personne.id, @personne.nom, @personne.prenom, etc.

    À présent, je souhaite créer une méthode qui ne correspondrait pas à un champs de la base de donnée. Par exemple si personnes comprend un champs anniversaire, j'aimerais pouvoir utiliser dans ma vue @personne.age .

    Pour obtenir cet âge, je dois utiliser la date courante et celle d'anniversaire (je sais que je pourrais obtenir la même chose directement en SQL, mais c'est à titre d'exemple).

    Dans /app/models/personne.rb, je suppose que je dois écrire quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def Personne.age
      diff = Time.now - Time.mktime(personne.anniversaire)
      [code ...]
      return age
    end
    Le premier obstacle auquel je me heurte étant de faire référence aux valeurs des champs à l'intérieur de cette méthode.

    Merci pour les pistes qui me permettraient d'avancer en ce sens.

    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,

    La syntaxe pour une méthode est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Personne < ActiveRecord::Base
     
      def age
        diff = Time.now - Time.mktime(anniversaire)
        [ code ... ]
        return age
      end
    end
    A savoir que :
    - return est facultatif, une méthode retourne par défaut sa dernière expression
    - ici anniversaire appelle directement la méthode anniversaire de l'instance. En revanche, pour les setters il faut faire self.toto = valeur car toto = valeur créerait une variable locale au lieu d'appeller le setter.

    Tu devrais probablement (re)voir les bases de Ruby pour mieux comprendre ce genre de choses
    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,
    Tu devrais probablement (re)voir les bases de Ruby pour mieux comprendre ce genre de choses
    C'est même certain.

    Il est étonnant comme on peut arriver rapidement à des applications fonctionnelles en RoR alors que les bases du langage vous échappent. Bien évidemment, c'est assez dangereux...

    Merci.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 104
    Points : 120
    Points
    120
    Par défaut
    La fait d'avoir écrit Personne.age semble indiquer que t'as pas complètement saisi la différence entre méthode de classe et d'instance, tu devrais aller voir dans le forum Ruby plus haut, y a justement un topic récent qui en parle

  5. #5
    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
    En revanche, pour les setters

    Sur google, les recherches sur "setter ruby" retournent plutôt des mamifères à poil roux. On pourrait un peu expliciter ?

    Sinon, pour la classe, ça marche bien, merci.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 104
    Points : 120
    Points
    120
    Par défaut
    Dans un modèle, si tu veux accéder à un champ pour le LIRE (ce qu'on appelle en général un getter), il te suffit de faire
    Par contre, si tu veux accéder à un champ pour ECRIRE dedans (un setter), il te faut mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonModel.monChamp = toto
    Il me semble que c'est simplement parce que si tu écris
    Ruby ne peut pas savoir si tu veux utiliser une nouvelle variable locale appellée "monChamp" ou si tu veux accéder au champ prééxistant de ton model. Et le comportement par défaut dans ce cas là c'est de créer une nouvelle variable (ce qu'au final, quand on travaille avec RoR est rarement le comportement attendu).

    Bien entendu, t'as aussi le droit d'unifier ton écriture et de mettre le nom du model pour les getter aussi, mais ca alourdit la lecture

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

Discussions similaires

  1. Comment créer une nouvelle IHM pour la création de classes
    Par walid0577 dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 22/08/2011, 16h14
  2. [Débutant] créer une méthode particuliere utilisable à volonté
    Par singleProject dans le forum Débuter avec Java
    Réponses: 16
    Dernier message: 10/06/2008, 09h16
  3. Réponses: 22
    Dernier message: 03/08/2007, 16h57
  4. Réponses: 21
    Dernier message: 23/05/2007, 17h16
  5. Comment créer une nouvelle fenetre pour recherche
    Par RaimS dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 02/06/2006, 17h02

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