12
votes

Validate avec: Si

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: xxx pré>

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


0 commentaires

4 Réponses :


19
votes

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


1 commentaires

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.



3
votes

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 si (@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 est égal à 1 et deux 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: xxx

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.)


1 commentaires

"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.



4
votes

Vous ferez mieux d'utiliser la numéricalité et égal à.

validates :one, :numericality => { :equal_to => 0 }

validates :two, :numericality => { :equal_to => 1 }


0 commentaires

11
votes

Vous pouvez le valider en une seule ligne:

validates :one, :two, :presence => true, :if => Proc.new { |a| !(a.one == 0 && a.two == 1) }


0 commentaires