J'ai ajouté une validation à un objet en utilisant:
validate :field, presence: true
J'ai trouvé qu'ils ne donnent pas de messages d'erreur. Je les ai changés en validates
et j'ai reçu les messages d'erreur. Ce ticket est pertinent.
J'ai essayé d'ajouter une validation personnalisée avec validates
et j'ai obtenu une erreur:
You need to supply at least one validation
Je l'ai changé en validate
, et tout s'est déroulé comme prévu.
Ma compréhension est d'utiliser validates
avec des validations normales et validate
avec des validations personnalisées. Est-ce correct? Y a-t-il d'autres pièces que je devrais connaître? Existe-t-il un moyen de faire échouer le premier problème et non pas de tout valider?
valide Cette méthode est un raccourci vers tous les validateurs par défaut et toutes les classes de validateur personnalisées se terminant par ‘Validator’. Notez que Rails les validateurs par défaut peuvent être remplacés à l'intérieur de classes spécifiques en créant des classes de validateur personnalisées à leur place telles que PresenceValidator.
validates :title, :body, :presence => true
validate, ajoute une méthode de validation ou un bloc à la classe. Cela est utile lorsque la substitution de la méthode d'instance de validation devient trop compliquée et que vous recherchez une déclaration plus descriptive de vos validations.
validate :must_be_friends
def must_be_friends
errors.add(:base, 'Must be friends to leave a comment') unless commenter.friend_of?(commentee)
end
Je crois que le :validate
la déclaration est utilisée pour la validation personnalisée où :validates
est utilisé pour la validation générique comme presence, uniqueness etc
sur un champ
La méthode validate
recherche une méthode avec le nom du paramètre, c'est-à-dire si vous faites validate :field
il cherchera
def field
end
sur votre object
. Puisque Rails définit un attr_accessor
pour chaque base de données field
le validate :field
appellerait la méthode de lecture de field
.
Si la fonction de validation renvoie true
ou s'il existe un objet error
, c'est-à-dire object.errors
n'est pas vide, alors l'objet est considéré valid?
D'où la raison de ligthouse
issue, ils se plaignent que validate
silently bypasses
la validation :)
J'espère que cela a du sens