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 :

attribuer une valeur au champ d'un objet passé dans un string


Sujet :

Ruby on Rails

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 68
    Points : 61
    Points
    61
    Par défaut attribuer une valeur au champ d'un objet passé dans un string
    Bonjour,

    J'ai un model pour lequel je veux attribuer une valeur a un champ en lui donnant le nom de l'attribut dans un string :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def set_value(attr_name, value)
      mon_objet.attr = value
    end
    Je sais bien réccupérer la valeur avec la fonction send : mon_objet.send(attr_name) mais je n'arrive pas a faire le contraire...
    J'ai cru voir quelque part un truc comme mon_objet.send(attr_name, value) mais ça ne marche pas. Pourtant y'a surement une p'tite fonction ruby qui fait ça mais je la trouve pas...
    Quelqu'un a une idée???

  2. #2
    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
    c'est pourtant bien ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Chien
      def aboie(phrase)
        puts phrase
      end
    end
     
    medor = Chien.new
     
    medor.send(:aboie, "wouf")
    # => "wouf"
    le seul truc, c'est que sent attends comme premier paramètre un symbole, et non pas une chaîne, utilises donc tachaine.intern pour obtenir un symbole
    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 du Club
    Inscrit en
    Octobre 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 68
    Points : 61
    Points
    61
    Par défaut
    Ca ne fonctionne toujours pas...
    Je pense que le probleme vient du fait que mon attr est bien un attribut et non pas une méthode...
    Je veux juste affecter une valeur a cet attribut.
    Ou peut-etre y a-t-il un autre probleme dans mon code???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def mise_a_jour_slider
       action = Action8d.find(params[:id_action])
     
        puts "Valeur a affecter = " + params[:slide_valeur]
        action.send(params[:nom_champ].intern, params[:slide_valeur].to_i)
        puts "New value = " + action.send(params[:nom_champ].intern).to_s
        puts "OK"
     
      end
    j'obtiens dans ma console :

    Valeur a affecter = 100
    New value = 50
    OK

  4. #4
    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
    ça marche aussi, si tu as créé des accesseurs pour ces variables :

    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 Chien
      attr_accessor :age
     
      def initialize(age=0)
        @age = age
      end
     
      def aboie(phrase)
        puts phrase
        puts "mon age est de #{@age} ans"
      end
    end
     
    medor = Chien.new
     
    medor.send(:aboie, "wouf")
    medor.send(:age=, 42)
    medor.send(:aboie, "waf")
    =>

    wouf
    mon age est de 0 ans
    waf
    mon age est de 42 ans
    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 du Club
    Inscrit en
    Octobre 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 68
    Points : 61
    Points
    61
    Par défaut
    Rien a faire ça veut pas...
    Je cherche et je reposte quand j'ai plus d'info.

    a+

  6. #6
    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
    Si j'ai tout compris, tu fais joujou avec un objet ActiveRecord.

    J'ai testé ça chez moi, et ça passe très bien (un objet profil a un champs "age" pour l'exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    a = Profile.find :first
    logger.debug a.age # => 25
    a.send(:age=, 42)
    logger.debug a.age # => 42
    /!\ : il ne faut pas oublier de faire un save sur ton objet une fois la modif effectuée

    /!\ (bis) : le symbole que tu passes à la méthode "send" doit être :nom_du_champs=. Le égal est important, puisque ce que fait Rails en utilisant attr_accessor, c'est créer deux méthodes : une age pour la lecture, et une age= pour l'écriture
    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 é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,

    Citation Envoyé par titoumimi
    le seul truc, c'est que sent attends comme premier paramètre un symbole, et non pas une chaîne
    Non pas forcément, testes et tu veras que ça passe très bien avec une chaine

    Citation Envoyé par bab_dev
    Je pense que le probleme vient du fait que mon attr est bien un attribut et non pas une méthode...
    Il n'y a pas d'attributs en Ruby. Il y a des variables d'instance, et des méthodes, ce qui permet de faire des accesseurs (getter/setter) mais c'est tout.
    attr_accessor :toto ne fait que définir les méthodes "toto" et "toto="

    Citation Envoyé par bab_dev
    Je veux juste affecter une valeur a cet attribut.
    Avec ActiveRecord, utilise write_attribute (cf. http://api.rubyonrails.org/classes/A...cord/Base.html (Overwriting default accessors))
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 68
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par titoumimi Voir le message
    Si j'ai tout compris, tu fais joujou avec un objet ActiveRecord.
    Oui c'est bien ça...

    /!\ (bis) : le symbole que tu passes à la méthode "send" doit être :nom_du_champs=. Le égal est important, puisque ce que fait Rails en utilisant attr_accessor, c'est créer deux méthodes : une age pour la lecture, et une age= pour l'écriture
    C'est bien ça qui manquait (le =)... et ça parait beaucoup plus logique comme ça.
    MERCI!

    Il n'y a pas d'attributs en Ruby. Il y a des variables d'instance, et des méthodes, ce qui permet de faire des accesseurs (getter/setter) mais c'est tout.
    Oui...j'ai des restes de mon ancien language de programmation...
    J'essai de faire mieux la prochaine fois!


    Merci pour l'aide et les explications.

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

Discussions similaires

  1. attribuer une valeur à un champ fct d'autres champs
    Par gladiamax dans le forum Modélisation
    Réponses: 3
    Dernier message: 22/07/2011, 03h37
  2. Attribuer une valeur à un champ du CrystalReportViewer?
    Par neo62matrix dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 14/05/2008, 14h03
  3. Attribuer une valeur à un champ texte
    Par areuh_fr dans le forum Langage
    Réponses: 7
    Dernier message: 06/01/2007, 18h10
  4. Attribuer une valeur au champ d'un formulaire
    Par Daniel MOREAU dans le forum Access
    Réponses: 2
    Dernier message: 03/10/2006, 17h18
  5. impossible d'attribuer une valeur a un objet
    Par el_quincho dans le forum Access
    Réponses: 2
    Dernier message: 10/01/2006, 11h18

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