J'essaie de créer une condition dans laquelle l'attribut 'One' est zéro et l'attribut 'Two' en est un, puis un modèle n'est pas valide. Mais quand je fais: Le test de l'unité renvoie true code>! Pourquoi? P>
validates :one, :two, :presence => true, :if => :if condition_testing?
def condition_testing?
!(one == 0 && two == 1)
end
4 Réponses :
Je pense que vous avez une erreur dans votre syntaxe:
validates :one, :two, :presence => true, :if => :condition_testing? def condition_testing? !(one == 0 && two == 1) end
Non, c'est correct. Ce qui se passe, c'est que quelles que soient toujours les valeurs des attributs indiquant que le modèle est valide et que je souhaite que lorsque «un» et «deux» sont 0 et 1 indiquant que le modèle est invalide.
Le problème est que vous utilisez un validateur de présence avec une condition qui vérifie les valeurs des attributs. Ceci est une erreur. Un validateur de présence vérifie pour s'assurer que ces attributs sont définis. Ce qui est pire, vous passez l'option Ceci ajoutera une erreur au modèle avec le message spécifié si la condition renvoie true. (Remarque: Je ne suis toujours pas clair sur quelle condition est valide et qui est invalide, alors n'hésitez pas à modifier cette dernière pièce à vos besoins.) P> p> si code> (@tigraine était correcte sur votre syntaxe qui a tort, à la manière), ce qui signifie que chaque fois que cette méthode revient vrai, la présence ne sera pas vérifiée du tout. . La façon dont vous avez cette configuration, le validateur ne fonctionnera que lorsque
one code> est égal à 1 et
deux code> est égal à 0. Sinon, aucune validation n'est exécutée du tout! Je pense que la meilleure option ici est d'écrire une validation personnalisée:
"Ce qui signifie que chaque fois que cette méthode revient vrai, la présence ne sera pas vérifiée du tout" - c'est complètement faux. Guides.RubyonRails.org/... - La validation ne fonctionne que si: Si la méthode retourne vrai.
Vous ferez mieux d'utiliser la numéricalité et égal à.
validates :one, :numericality => { :equal_to => 0 } validates :two, :numericality => { :equal_to => 1 }
Vous pouvez le valider en une seule ligne:
validates :one, :two, :presence => true, :if => Proc.new { |a| !(a.one == 0 && a.two == 1) }