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?
Ajouter :allow_blank => true
et il devrait faire ce que vous voulez.
Peut être :if => lambda {|attr| attr.present?}
aidera?
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.