ruby on rails - validations - Validar atributo solo si está presente(solo si el usuario lo rellena)
rails validates if (3)
Necesito validar algunos atributos SÓLO si no están vacíos.
Por ejemplo, el usuario puede tener un logotipo. Si intentamos cargarlo, la validación debería funcionar. Si simplemente actualizamos los datos del usuario sin el logotipo, la validación debe omitirse.
Ahora tengo:
El formulario tiene una opción de dos archivos. Uno - logotipo, segundo - avatar. Ambos atributos forman parte del modelo de Usuario. En el modelo de usuario a tiene validación:
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("...")
En este caso, si tratamos de crear un nuevo usuario sin el logotipo y el avatar seleccionados, tendremos errores (nuestra validación). Probé la validación de cambio y agregué ": on =>: update" de esta manera:
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
Ahora puedo crear un usuario sin el logotipo y el avatar seleccionados, pero si intento editar al usuario e intento cargar solo el logotipo, tengo errores de validación de avatar. Si elijo archivo para avatar y el logotipo lo dejo en blanco, tengo errores de validación para el logotipo.
¿Cómo puedo ejecutar la validación ony para el atributo que quiero cambiar?
Agregue :allow_blank => true
y debería hacer lo que quiera.
Algunas validaciones aceptan las opciones :allow_blank => true
o :allow_nil => true
.
Si esto falla, use: if condition, como este:
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? }
Pero te animo a usar permite. Mucho más limpio.
Quizás :if => lambda {|attr| attr.present?}
:if => lambda {|attr| attr.present?}
ayudará?