web-dev-qa-db-fra.com

Validez l'attribut uniquement s'il est présent (uniquement si l'utilisateur le remplit)

J'ai besoin de valider certains attributs UNIQUEMENT s'ils ne sont pas vides.

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

Maintenant j'ai:

Le formulaire a le choix entre deux fichiers. Un - logo, deuxième - avatar. Ces deux attributs font partie du modèle utilisateur. Dans le modèle utilisateur a une 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 logo et avatar sélectionnés, nous aurons des erreurs (notre validation). J'ai essayé de valider les modifications et d'ajouter ": on =>: update" 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 logo et avatar sélectionnés, mais si j'essaie de modifier l'utilisateur et d'essayer de télécharger uniquement le logo - j'ai des erreurs de validation de l'avatar. Si je choisis un fichier pour l'avatar et le logo, laissez vide - j'ai des erreurs de validation pour le logo.

Comment puis-je exécuter la validation uniquement pour l'attribut que je souhaite modifier?

58
prosto.vint

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

119
Mark Thomas

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

10
Sławosz

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.

9
miguel.camba