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 Discussion :

Problème avec une méthode. [Débutant(e)]


Sujet :

Ruby

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    autre
    Inscrit en
    Février 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : autre
    Secteur : Transports

    Informations forums :
    Inscription : Février 2017
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Problème avec une méthode.
    Bonjour à tous,

    J'ai un souci dans l'appel d'un méthode associé à une class que j'ai définit :

    ma classe :

    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
    Class User < ApplicationRecord
       before_save :init
     
       def ban
          self.status = "ban"
          self.save
          puts self
       end
     
       def to_s
          status.to_s + " " + id.to_s
       end
     
       def init
          self.status = "actif"
       end
    end

    Dans mes tests en fonction de la façon dont j'appel la fonction ban j'obtient deux résultat différents.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    test "bannissement methode 1" do
       user=User.new
       user.save
       user.ban
       puts User.all
    end
    test "bannissement methode 2" do
       user=User.new
       user.save
       User.all.first.ban
       puts User.all
    end
    résultats :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    test 1:
    >>ban 1   # sortie du puts de la méthode ban
    >>ban 1   # sortie du puts User.all du test
     
    test 2: 
    >>ban 1   # sortie du puts de la méthode ban
    >>actif 1   # sortie du puts User.all du test
    Je comprend pas pourquoi les deux test renvoi un résultat différent.

    l'idée serait de pouvoir utilisé la méthode ban dans un bloc each avec un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    users = User.where(comportement: "boulet")
    users.each{|user| user.ban}

  2. #2
    Membre actif
    Profil pro
    Problem Solver
    Inscrit en
    Juin 2013
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Problem Solver

    Informations forums :
    Inscription : Juin 2013
    Messages : 138
    Points : 231
    Points
    231
    Par défaut ban
    Salut,

    rien de trop grave dans ton code mais plein de petites "habitudes de rubyiste" qui pourraient t'aider.

    Tout d'abord la méthode "ban" fait 2 choses : 1) mettre le statut 2) sauvegarder dans la base de données.
    C'est une méthode "dangereuse" donc je préfèrerais que tu l'appelles "ban!" (oui avec un point d'exclamation)

    Du coup quand tu testes, tu t'embêtes à faire de nouveaux users et les sauvegarder puis les bannir,
    tu fais un peu du travail en double, ça me gêne aussi

    ---

    Imagine que tu doives faire plusieurs manipulations sur l'utilisateur, et qu'il y a des validations (disons le mail doit être rempli), et que, par exemple, tenter de créer un utilisateur de moins de 13 ans t'envoie un mail.

    Si tu fais u = User.new; u.ban; u.age = 10; u.save ça va tenter une sauvegarde qui plante, t'envoyer un mail, puis tu complètes et ça marche.
    Si tu fais u = User.new; u.age = 10; u.ban; u.save ça marcherait sans souci, et sans mail.

    Morale de l'histoire : faire plusieurs choses d'un coup, c'est bizarre, et ça va te jouer des tours

    ---

    Et ensuite je vois que tu créées un user mais dans ton test tu en as deux ?
    Du coup je ne sais pas si celui qui est encore actif est celui que tu viens de faire, ou un autre qui était là d'avant.
    C'est un peu déroutant, mais rajoute des logs (l'ID ou des created_at par exemple) et ça va vite se voir

    ---

    Autres habitudes que j'ai :

    - j'aime bien utiliser les raccourcis de syntaxe tableau.each{|x| x.methode} => tableau.each(&:methode)
    - je préfère MAP que EACH parce que MAP te renvoie le tableau des résultats, EACH te renvoie le tableau de départ
    - je garde le résultat pour avoir des message dans l'interface (exemple : "7 utilisateurs boulets, 5 bannis, 2 erreurs en tentant de bannir : titi et toto")
    - si je fais une variable temporaire pour une ligne, je la retire

    Ton code devient alors User.where(comportement: "boulet").map(&:ban!)

    Bon courage et à bientôt !

Discussions similaires

  1. Problème avec une méthode d'une classe
    Par ChPr dans le forum Android
    Réponses: 5
    Dernier message: 16/03/2013, 11h52
  2. [PHP 5.3] [POO]Problème avec une méthode statique
    Par yann18 dans le forum Langage
    Réponses: 6
    Dernier message: 25/05/2011, 19h32
  3. Problème avec une méthode en Java
    Par hala02 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 21/12/2010, 22h56
  4. Réponses: 5
    Dernier message: 29/05/2008, 10h05
  5. Problème avec une méthode virtuelle pure
    Par Burckel dans le forum C++
    Réponses: 4
    Dernier message: 05/12/2006, 13h00

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