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 :

[rails 3.0.3] validation booleen


Sujet :

Ruby on Rails

  1. #1
    Membre éprouvé Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Points : 1 161
    Points
    1 161
    Par défaut [rails 3.0.3] validation booleen
    Bonsoir

    voici mon problème: je veux permettre de créer un compte utilisateur avec un système d'activation du compte.
    Je veux donc valider que dans mon modèle la valeur soit true ou false

    voici donc mon modèle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class User < ActiveRecord::Base
     
     
     
          #Autres validations pour d'autres champs
            validates :account_active,:presence => true,:numericality => true, :inclusion => {:in => 0..1}
     
     
    end
    1 ) du coup quand j'utilise la console pour faire mes tests
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    rails c
    require 'user.rb'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
     us=User.new(:name => "test",:first_name => "test",:password => "0000",:email => "mail@test",:account_active => 1)
    Le problème est que lorsque je veux voir si les données sont valides avec

    j'ai l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    TypeError: can't convert nil into String
        from /usr/local/ruby/lib/ruby/gems/1.9.1/gems/activemodel-3.0.3/lib/active_model/validations/inclusion.rb:12:in `include?'
        from /usr/local/ruby/lib/ruby/gems/1.9.1/gems/activemodel-3.0.3/lib/active_model/validations/inclusion.rb:12:in `validate_each'
        from /usr/local/ruby/lib/ruby/gems/1.9.1/gems/activemodel-3.0.3/lib/active_model/validator.rb:154:in `block in validate'
        from /usr/local/ruby/lib/ruby/gems/1.9.1/gems/activemodel-3.0.3/lib/active_model/validator.rb:151:in `each'
        from /usr/local/ruby/lib/ruby/gems/1.9.1/gems/activemodel-3.0.3/lib/active_model/validator.rb:151:in `validate'
        from /usr/local/ruby/lib/ruby/gems/1.9.1/gems/activesupport-3.0.3/lib/active_support/callbacks.rb:314:in `_callback_before_245'
        from /usr/local/ruby/lib/ruby/gems/1.9.1/gems/activesupport-3.0.3/lib/active_support/callbacks.rb:494:in `_run_validate_callbacks'
    2) De plus lorsque dans mon modèle je veux specifier que c'est integer
    j'ai une erreur


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class User < ActiveRecord::Base
     
     
     
          #Autres validations pour d'autres champs
            validates :account_active,:presence => true,:numericality => true, :inclusion => {:in => 0..1},:only_integer => true
     
     
    end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rails ArgumentError: Unknown validator: 'only_integer'
    Et enfin j'ai une 3 question :-)
    Est-ce que lorsque à partir de la console j'execute un require, plusieurs fois , ruby charge à niveau la classe ou bien il vérifie d'abord si le fichier a changer ?

    Est-ce que quelqu'un a une idée svp ?



    Merci d'avance

  2. #2
    Membre éprouvé Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Points : 1 161
    Points
    1 161
    Par défaut
    Bon laissez tomber le point 1) l'erreur vient d'ailleurs
    par contre si vous avez une idée pour les deux autres points je suis preneur

    merci encore

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    171
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 171
    Points : 218
    Points
    218
    Par défaut
    Bonjour,

    Pour ton point 2 essaie quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class User < ActiveRecord::Base
     
           #Autres validations pour d'autres champs
           validates :account_active,
                                  :presence => true,
                                  :numericality => {:only_integer => true}, 
                                  :inclusion => {:in => 0..1}
     
    end
    Avec la méthode validates lorsque le validator que tu souhaites invoqué prend des paramêtres en options, tu les lui passes via un hash (et tu supprimes le true qui n'est utile que lorsque le validator ne prend aucun paramètre).

  4. #4
    Membre éprouvé Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonjour

    merci pour ta réponse . J' implementes ça tout à l'heure et je te redis

    Par contre est-ce que tu peux me dire quelle est la différence entre les deux syntaxes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    class User < ActiveRecord::Base
     
     
     
          #Autres validations pour d'autres champs
            validates :account_active,:presence => true
     
    end
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class User < ActiveRecord::Base
     
     
     
          #Autres validations pour d'autres champs
            validates_presence_of :account_active
     
     
    end
    Je sais que la première séquence est arrivée avec rails 3 .
    Lors de mon test lorsque j'appelle la méthode valid?
    dans le premier cas j'ai une exception alors que dans le deuxième cas la méthode me renvois false

    Est-ce que quelqu'un peut me confirmer ou infirmer ce comportement et me donner d'autres infos svp ?
    Si ça se trouve j'ai une erreur ailleurs qui me génère cette exception ...Je vais essayer de tester et d'isoler le cas


    merci encore et bonne journée

  5. #5
    Membre actif

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    171
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 171
    Points : 218
    Points
    218
    Par défaut
    Il n'y as pas de différences majeures entre les deux syntaxes.

    La deuxième écriture à l'avantage de permettre de spécifier plusieurs validators pour le même attribut sans avoir à réécrire à chaque fois le nom de l'attribut. Du coup, toutes le validations se référant à un même attribut sont facilement identifiables.

    En revanche, le fait que tu obtiennes une exception dans un cas et pas dans l'autre est étrange.
    Quelle est l'exception que tu récupères ?

  6. #6
    LXS
    LXS est déconnecté
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 106
    Points : 137
    Points
    137
    Par défaut
    Les deux syntaxes sont strictement identiques. A vrai dire voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    module Validations
        class PresenceValidator < EachValidator
          def validate(record)
            record.errors.add_on_blank(attributes, options)
          end
        end
     
        module HelperMethods
          def validates_presence_of(*attr_names)
            validates_with PresenceValidator, _merge_attributes(attr_names)
          end
        end
    end

    Sur ta question
    Est-ce que lorsque à partir de la console j'execute un require, plusieurs fois , ruby charge à niveau la classe ou bien il vérifie d'abord si le fichier a changer ?
    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
    >> $"
    => [] #j'ai volontairement tronqué le résultat
    >> require 'p'
    => true
    >> $"
    => ["p.rb"]
    >> hello
    "world"
    => nil
    >> require 'p'
    => false
    >> $"
    => ["p.rb"]
    >> hello
    "world"
    => nil
    >> require './p'
    => true
    >> $"
    => ["p.rb", "./p.rb"]
    >> hello
    "world2"
    => nil

    require garde une trace de tous les fichiers qu'il a chargé. Pour autant si tu lui donnes un chemin différent, il rechargera le fichier (et donc modifiera constantes, modules, classes, méthodes, etc. définis dans le fichier).

    Dernier point:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rails c
    require 'user.rb'
    Nul besoin de faire cela, Rails va automatiquement te charger les modèles (situés dans /app/models).

  7. #7
    LXS
    LXS est déconnecté
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 106
    Points : 137
    Points
    137
    Par défaut
    J'ai oublié de mentionner un gem que j'ai crée il y a quelques semaines, ActiveValidators, qui implémente de nouveaux validateurs non standards:

    • email
    • url
    • phone
    • slug
    • ip
    • credit_card
    • date
    • password

  8. #8
    Membre éprouvé Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Points : 1 161
    Points
    1 161
    Par défaut
    Merci à tous les deux pour vos réponses
    J'ai mal codé mon validateur d'où mon exception

    Il reste que je n'arrive toujours pas à valider les booléens

    voici mon code du modèle
    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
     
    class User < ActiveRecord::Base
     
            #FIXME:PUT THE RIGHT REGEXP FOR MAIL        
     
            validates :name,:presence => true,:length => {:maximum => 50}
            validates :first_name,:presence => true,:length => {:maximum => 50}
            validates :email,:presence => true,:length => {:maximum => 50}
            validates :password,:presence => true,:length => {:maximum => 30}
            validates :account_active,:presence => true,:inclusion => {:in =>[true,false]}
     
            validates :genre,:presence => true,:inclusion => {:in => ('M' 'F')}
     
     
     
    end
    Et voici comment je crée mon user (et d'ailleurs je crois que le problème vient de là)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    > us1 = User.new(:name => "name",:first_name => "firstname",:password => "0000", :email => "mail@mail.com",:genre => "M", :account_active => true)
     
    >us1.valid?
    => true
     
    > us1 = User.new(:name => "name",:first_name => "firstname",:password => "0000", :email => "mail@mail.com",:genre => "M", :account_active => false)
     
    >us1.valid?
    => false
    je comprend pas pourquoi dans le deuxième cas j'ai un retour false
    Pourtant je me base sur la doc:

    http://guides.rubyonrails.org/active_record_validations_callbacks.html


    de plus lorsque que je regarde les erreurs, j'obtiens ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    irb(main):003:0> us1.errors
    => {:account_active=>["can't be blank"]}
    fin du §3.9 validates_presence_of
    merci encore

  9. #9
    Membre éprouvé Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Points : 1 161
    Points
    1 161
    Par défaut
    J'ai enfin compris. Mea culpa j'avais mal lu la doc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Since false.blank? is true, if you want to validate the presence of a boolean field you should use validates_inclusion_of :field_name, :in => [true, false].
    donc pour que ça intéresse validates_presence_of vérifie que l'attribut vaut true
    Donc pour valider on met

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    validates :account_active,:inclusion => {:in => [true, false]}
    et ça suffit


    merci encore pour vos réponses

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

Discussions similaires

  1. test et validation de votre programme!!!
    Par l'indien dans le forum C
    Réponses: 8
    Dernier message: 25/06/2003, 15h43
  2. validation d'un XML schema
    Par nicolas_jf dans le forum Valider
    Réponses: 2
    Dernier message: 05/05/2003, 11h25
  3. est ce un XSchema Valide?
    Par Slash dans le forum Valider
    Réponses: 4
    Dernier message: 06/03/2003, 14h01
  4. tester si une date est valide
    Par Andry dans le forum Langage
    Réponses: 5
    Dernier message: 17/09/2002, 11h54
  5. [VB6] Evenement validate
    Par grosjej dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 05/09/2002, 15h46

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