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 :

Sauvegarde d'un objet


Sujet :

Ruby on Rails

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Sauvegarde d'un objet
    Bonjour
    Tout d'abord, je tiens à m'excuser si je n'utilise pas les bon termes pour ma question, bien que bidouilleur depuis longtemps des langages web, je suis toujours resté au stade de bidouilleur

    Ma question est la suivante, comme faire une copie d'un objet, afin de la sauvegarder dans une autre table mysql ?

    Situation:
    j'ai des "gymnastes", appartenant a des "groupes" (par habtm). Ces gymnastes sont éditables par plusieurs utilisateurs. Afin de garder une trace des modifications (une sorte de journal des actions), je veux qu'au moment de la mise a jour du gymnaste, une nouvelle entrée soit ajoutée dans une autre table, par exemple "sauvegarde".

    J'ai plus ou moins réussi, de la manière suivante (mais c'est moche, long et pas DRY du tout comme je dois mettre dans ça dans new,update et destroy):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sauvegarde = Sauvegarde.new()
    sauvegarde.name = gymnaste.name
    sauvegarde.firstname = gymnaste.firstname
    (etc)
    J'ai essayé des méthodes comme clone, mais sans résultats. De plus, la relation habtm entre gymnaste et groupe m'oblige à en créer une aussi entre sauvegarde et groupe.

    Merci d'avance si vous avez une idée

  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,

    mais c'est moche, long et pas DRY du tout comme je dois mettre dans ça dans new,update et destroy
    C'est par ce que tu te places au mauvais endroit, tu essayes de faire la sauvegarde dans ton contrôleur alors qu'il vaudrait mieux la faire dans ton modèle (avec des callbacks comme after_update ou after_destroy).
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  3. #3
    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 Taum Voir le message
    Salut,


    C'est par ce que tu te places au mauvais endroit, tu essayes de faire la sauvegarde dans ton contrôleur alors qu'il vaudrait mieux la faire dans ton modèle (avec des callbacks comme after_update ou after_destroy).
    dans le cas présent, un before_update peut-être, pour pouvoir conserver l'ancien état
    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

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Taum Voir le message
    Salut,
    C'est par ce que tu te places au mauvais endroit, tu essayes de faire la sauvegarde dans ton contrôleur alors qu'il vaudrait mieux la faire dans ton modèle (avec des callbacks comme after_update ou after_destroy).
    Ah j'avais pas pensé a essayé de ce coté la! J'ai pas encore beaucoup utilisé la partie modèle, faudrai que je m'y mette

    Merci pour la piste, je vais voir du coté des callbacks (que j'ai jamais utilisé, je crois)!

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Quelque chose comme ca, ca pourrait jouer ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Gymnaste < ActiveRecord::Base
      has_and_belongs_to_many :groups
     
      before_update :save_new_gymnaste
     
      protected
     
      def save_new_gymnaste
        gymnaste = Gymnaste.find(params[:id]) #on peut faire ça dans un model?
        Sauvegarde.new({:name => gymnaste.name},{:firstname => gymnaste.firstname}, {:age => gymnaste.age })
        Sauvegarde.save
     
      end
    end

  6. #6
    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 shlag Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      def save_new_gymnaste
        gymnaste = Gymnaste.find(params[:id]) #on peut faire ça dans un model?
        Sauvegarde.new({:name => gymnaste.name},{:firstname => gymnaste.firstname}, {:age => gymnaste.age })
        Sauvegarde.save
      end
    Si je comprend bien, cette fonction est appelée lors de l'update de ton objet. Comme c'est une fonction de ta classe Model, la fonction est appelée par ton objet gymnaste lorsqu'il est modifié. Tu n'as pas besoin d'aller chercher ton objet, c'est l'objet courant (=self)
    Tu dois juste faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      def save_new_gymnaste
        Sauvegarde.new({:name => self.name},{:firstname => self.firstname}, {:age => self.age })
        Sauvegarde.save
      end

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci pour ta réponse !

    J'ai essayé comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      def save_new_gymnaste
        Sauvegarde.new(self.attributes)
        Sauvegarde.save
      end
    Mais ca me renvoie l'erreur suivante:

    undefined method `save' for Sauvegarde:Class

  8. #8
    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
    C'est normal, tu appelles save sur ta classe, là ou tu devrais l'appeler sur une instance de ta classe.
    Essaye plutôt un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def save_new_gymnaste
        Sauvegarde.new(self.attributes).save
    end
    ou mieux, il me semble que la methode create créé un nouvel objet et le sauve directement, dans ce cas un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def save_new_gymnaste
        Sauvegarde.create(self.attributes)
    end
    devrait suffire

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci!
    Ca marche avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def save_new_gymnaste
        Sauvegarde.create(self.attributes)
    end
    Par contre j'ai fait un before_update :save_new_gymnaste


    et il se passe que ca me crée un objet Sauvegarde avec les attributs deja mis à jour quand je fais une édition d'un gymnaste, donc ca crée pas la sauvegarde avant l'update mais après... normal ?

  10. #10
    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,

    Le problème est que tu changes le contenu de attributes en modifiant ton modèle, la méthode save ayant pour rôle de sauvegarder l'état du modèle dans la base de données.

    J'imagine que ceci devrait marcher, même si ça fait un peu bidouille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def save_new_gymnaste
        Sauvegarde.create(Gymnaste.find(id).attributes)
    end
    Gymnaste.find(id) devrait récuperer une instance de Gymnaste correspondant à ce qui se trouve à ce moment dans la bdd (donc pas mis à jour), sans toucher aux modifications faites sur l'instance en cours, qui pourra donc être sauvegardée juste après (une fois les before_update terminés)
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/01/2011, 21h15
  2. [MooTools] Request.JSON et sauvegarde de mon objet
    Par erox44 dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 01/12/2010, 13h20
  3. probleme de sauvegarde d'un objet
    Par isoman dans le forum Hibernate
    Réponses: 5
    Dernier message: 30/01/2009, 09h03
  4. Sauvegarde d'un objet
    Par Limuath dans le forum C#
    Réponses: 9
    Dernier message: 21/10/2007, 13h55
  5. Sauvegarde d'un objet par une session
    Par doustij dans le forum Langage
    Réponses: 4
    Dernier message: 11/03/2007, 14h02

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