2010-08-22 13 views
19

Mi modelo de usuario contiene: nombre,: correo electrónico y campos de contraseña. Todos los 3 tienen validaciones de longitud. Una página web de "actualización de cuenta" permite al usuario actualizar su nombre y dirección de correo electrónico, pero no contraseña. Cuando se presentó, params [: Usuario] esEn Rails 3, ¿cómo puedo omitir la validación del campo de contraseña cuando no estoy tratando de actualizar la contraseña?

{"name"=>"Joe User", "email"=>"[email protected]"} 

cuenta que no hay tecla "contraseña" debido a que el formulario no contiene un campo de entrada tales.

Cuando llamo

@user.update_attributes(params[:user]) 

la validación de contraseña falla. Sin embargo, dado que no estoy intentando actualizar la contraseña, no quiero que la validación de la contraseña se ejecute en esta actualización. Estoy confundido por qué la validación de la contraseña se está ejecutando cuando params [: usuario] no contiene una clave de "contraseña".

Tenga en cuenta que quiero tener una página web separada en otro lugar que permita al usuario actualizar su contraseña. Y para ese envío, la validación de contraseña debe ejecutarse.

Gracias.

+1

No debería estar ejecutando la validación de la contraseña y fallar si el campo de la contraseña es válido primero. Usted dice que no está ingresando la contraseña, pero tengo mis sospechas de que era. –

Respuesta

27

Mi aplicación hace algo como esto

attr_accessor :updating_password 

validates_confirmation_of :password, :if => should_validate_password? 

def should_validate_password? 
    updating_password || new_record? 
end 

lo que tiene que model.updating_password = true para la verificación a tener lugar, y usted no tiene que hacer esto en la creación.

Lo que me pareció a un buen Railscast en http://railscasts.com/episodes/41-conditional-validations

+0

Gracias, Mathepic. Esto funcionó para mí. – Sanjay

+0

¿Tal vez usar el helper 'password_changed?' En su lugar? –

+0

@PeterEhrlich que levantará un método que falta cuando se usa 'has_secure_password'. Tendría que llamar a 'password_digest' ya que, si la contraseña está presente, se volverá a generar. – Mohamad

0

una aplicación que estoy trabajando en los siguientes usos:

validates_confirmation_of :password, 
           :if => Proc.new { |account| 
               !account.password.blank? 
               || !account.password_confirmation.blank? 
               || account.new_record? } 

Dependiendo de sus necesidades, es posible que desee quitar el new_record? check

+0

Parece que eliminar el punto de confirmación: no confirmará si no especificó la confirmación en el formulario. – alternative

+0

Hmm ... parece un error, tienes razón. –

1

En su modelo de usuario, puede ignorar la validación de la contraseña si no está configurada.

validates_length_of :password, :minimum => N, :unless => lambda {|u| u.password.nil? } 
+3

¿Permitiría esto que alguien establezca una contraseña en blanco? – Pete

1

Usando update_attributes no va a cambiar el valor de la contraseña si no hay una clave para que en el hash params.

La validación no se ejecuta solo en los campos modificados. Valida valores existentes también.

Su validación debe estar fallando porque el campo de contraseña contiene algún contenido no válido que ya está guardado en la base de datos. Supongo que probablemente sea porque estás haciendo hash después de la validación y estás tratando de validar la cadena hash.

Puede usar un atributo virtual (una variable o método de instancia) que valide con un método personalizado, y luego asigne el hash al campo de contraseña almacenada. Eche un vistazo a this technique para ideas.

0
When password is added then only confirmation will be called and presence will call on create action only 

    **validates_presence_of :password, :on =>:create** 

    **validates_confirmation_of :password** 
Cuestiones relacionadas