web-dev-qa-db-fra.com

Rails - Validation: si une condition est vraie

On Rails 5.

J'ai un modèle Order avec un attribut description. Je ne veux valider sa présence que si l'une des deux conditions est remplie: si l'étape en cours est égale à la première étape OR si require_validation est égal à true.

Je peux facilement valider en fonction d'une condition comme celle-ci:

validates :description, presence: true, if: :first_step?

def first_step?
 current_step == steps.first
end

mais je ne sais pas comment procéder pour ajouter une autre condition et valider si l'une ou l'autre est vraie.

quelque chose comme:

validates :description, presence: true, if: :first_step? || :require_validation

Merci!

15
Kathan

Vous pouvez utiliser un lambda pour le if: clause et faire une condition ou.

validates :description, presence: true, if: -> {current_step == steps.first || require_validation}
28
SteveTurczyn

Pouvez-vous simplement l'envelopper dans une seule méthode? Selon les docs

: if - Spécifie une méthode, un proc ou une chaîne à appeler pour déterminer si la validation doit avoir lieu (par exemple, si:: allow_validation, ou si: Proc.new {| user | user.signup_step> 2}). La méthode, proc ou chaîne doit renvoyer ou évaluer une valeur vraie ou fausse.

validates :description, presence: true, if: :some_validation_check

def some_validation_check
    first_step? || require_validation
end
9
jready

Vous pouvez passer un lambda à évaluer comme condition if.

Essayer:

validates :description, presence: true, if: -> { first_step? || require_validation }
2
Malav Bhavsar

Si vous ne voulez pas ajouter une méthode comme le dit Jared, vous pouvez essayer d'utiliser lambda

validates :description, presence: true, if: ->{ first_step? || require_validation }
1
Alexander Kuznetsov