61 votes

Valider l'attribut seulement s'il est présent (seulement si l'utilisateur le remplit)

J'ai besoin de valider certains attributs UNIQUEMENT si elles ne sont pas vides.

Par exemple, l'utilisateur peut avoir un logo. Si nous essayons de le charger de validation devrait fonctionner. Si nous nous contentons de mettre à jour les données de l'utilisateur sans le logo, la validation doit être ignorée.

Maintenant, j'ai:

La forme a un choix de deux fichiers. Un logo, deuxième avatar. Deux de ces attributs est la part de l'Utilisateur modèle. Dans le modèle Utilisateur de un ont de validation:

validates_preference_of :logo_file_name, :message=>I18n.t("...")
validates_format_of :logo_file_name, :with=>/\.(jpeg|jpg|png|gif)$/i, :message=> I18n.t("...")
validates_preference_of :avatar_file_name, :message=>I18n.t("...")
validates_format_of :avatar_file_name, :with=>/\.(jpeg|jpg|png|gif)$/i, :message=> I18n.t("...")

Dans ce cas, si nous essayons de créer un nouvel Utilisateur sans choix du logo et de l'avatar, nous allons avoir des erreurs (la validation). J'ai essayé de changer de validation et d'ajouter ":sur => :mise à jour", comme ceci:

validates_preference_of :logo_file_name, :message=>I18n.t("..."), :on => :update
validates_format_of :logo_file_name, :with=>/\.(jpeg|jpg|png|gif)$/i, :message=> I18n.t("..."), :on => :update
validates_preference_of :avatar_file_name, :message=>I18n.t("..."), :on => :update
validates_format_of :avatar_file_name, :with=>/\.(jpeg|jpg|png|gif)$/i, :message=> I18n.t("..."), :on => :update

Maintenant, je peux créer un utilisateur sans choix du logo et de l'avatar, mais si j'essaie de modifier l'utilisateur et essayez de charger uniquement le logo - j'ai des erreurs de validation de l'avatar. Si je choisis de fichier pour l'avatar et le logo laissez vide - j'ai des erreurs de validation pour logo.

Comment je peux courir validation ony pour l'attribut que je veux changer?

124voto

Mark Thomas Points 19281

Ajoutez :allow_blank => true et il devrait faire ce que vous voulez.

10voto

miguel.camba Points 578

Certaines validations acceptent les options :allow_blank => true ou :allow_nil => true .

Si cela échoue, utilisez: if condition, comme ceci:

 validates_format_of :avatar_file_name, 
 :with=>/\.(jpeg|jpg|png|gif)$/i, 
 :message=> I18n.t("..."), 
 :on => :update,
 :if => lambda{ |object| object.avatar_file_name.present? }
 

Mais je vous encourage à utiliser permet. Beaucoup plus propre.

10voto

Sławosz Points 3057

Peut-être que :if => lambda {|attr| attr.present?} aidera?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X