web-dev-qa-db-fra.com

Quelle est la différence entre "valider" et "valider"?

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?

50
Lucy Bain

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
68
rmagnum2002

Je crois que le :validate la déclaration est utilisée pour la validation personnalisée: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 validatesilently bypasses la validation :)

J'espère que cela a du sens

9
Viren