validator validations validates rails method greater_than custom create ruby-on-rails ruby validation

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á?