2009-11-04 9 views
11

que tienen un modelo de usuario con los atributos habituales, tales como correo electrónico y hashed_password etc. Quiero escribir una validación que comprueba la presencia de una dirección de correo electrónico, pero sólo cuandorieles de validación de usuarios de correo electrónico - sólo lo quieren para validar cuando un usuario se inscribe o actualizaciones de dirección de correo electrónico

1) no hay uno almacenado en la base de datos para este objeto (es decir, este es un usuario nuevo inscribirse)

2) el usuario está intentando actualizar su dirección de correo electrónico .

Mis validaciones actuales

validates_presence_of :email 
    validates_presence_of :email_confirmation 

    validates_confirmation_of :email 

están impidiendo obviamente mí desde la actualización de los atributos. Pensé en usar

validates_presence_of: correo electrónico,: si: email_validation_required?

def email_validation_required? 
self.email.blank? 
end 

Pero eso no ayudará con el escenario 2, ya que volverá cierto porque el usuario tiene una dirección de correo electrónico contraseña en el PP.

no puedo averiguar cómo puedo limitarlo a sólo esos 2 escenarios anteriores.

¿Alguien puede ayudar?

Respuesta

18

creo EMFI está en lo cierto. Pero no creo que el validates_presence_of :email deba estar reteniéndote. El email siempre debe estar presente; si se deja en blanco en la forma, el parámetro no interferirá con el guardado del usuario. Si se ingresa en el formulario, incluso para la actualización, debe tener un email_confirmation junto con el viaje.

seguirlo:

validates_presence_of :email 
validates_presence_of :email_confirmation, :if => :email_changed? 

validates_confirmation_of :email 
+0

disculpa por la respuesta tardía barry, tienes razón al respecto no me detiene. Solo estaba replicando el código de password_confirmation para email_confirmation, pero eso tiene diferentes requisitos. Gracias por mencionarlo. – robodisco

10

tiene dos opciones. uno es usar :on. por defecto, que se establecen en , pero se puede hacer algo como esto esta

validates_presence_of :email, :on => :create 

o

validates_presence_of :email, :on => :update 

las otras opciones es usar :if, y luego pasar en un nombre de método o un proc . así que algo como

validates_presence_of :email, :if => :should_validate 

o

validates_presence_of :email, :if => Proc.new { |user| user.signup_stage > 2 } 

Espero que ayude :)

+0

hi mate gracias por su ayuda. Había pensado usar un método con: if, pero me quedé perplejo sobre cómo escribir la lógica dentro de él. Me preguntaba si había una forma sin tener que introducir más atributos en mi modelo. Noté en su último ejemplo que menciona un atributo signup_stage. – robodisco

+0

Solo estaba dando ejemplos bastante genéricos. Al volver a leer su pregunta, ¿por qué el correo electrónico estará en blanco en su modelo si el usuario tiene una contraseña en la base de datos? –

+0

siento que la contraseña era un error tipográfico, debería haber leído el correo electrónico. Editado la publicación. – robodisco

3

Usted desea utilizar una: si la cláusula sobre la validación que utiliza el ActiveRecord :: Dirty métodos:

validates_presence_of :email, :if => Proc.new { |user| user.email_changed?} 

NB Solo funciona en Rails 2.1 o posterior.

Cuestiones relacionadas