2012-08-24 8 views
5

He estado buscando una forma de permitir a los usuarios cambiar su configuración (modelo de usuario) sin tener que cambiar su contraseña (aún deben ingresar su contraseña actual). Inventar fuera de la caja parece permitir esto, pero cuando elimina el módulo validable y configura las validaciones personalizadas, parece que necesita trabajar un poco.Rails3 + Devise: evitar la validación de contraseña al actualizar

He fijado la siguiente validación en mi modelo de usuario:

validates :password, length: { in: 6..128 } 

Al registrarse, se requiere usuario especificar su contraseña (que es lo que esperaba). Sin embargo, al actualizar la configuración, si dejo la contraseña en blanco, se genera un error para el usuario que dice que la contraseña debe tener al menos 6 caracteres.

¿Cómo puedo evitar esto sin tener que cambiar la forma en que funciona Devise o tener que implementar un controlador personalizado de algún tipo?

Respuesta

13

Quizás esto se vea obvio para algunos, pero me llevó un tiempo reunir esto. Después de algunas horas de probar diferentes soluciones y soluciones y buscar por todos lados, profundicé en las validaciones de Rails y encontré algunas construcciones que, cuando se unen, hacen que esto sea realmente fácil.

Todo lo que tenía que hacer era configurar una validación para la acción de creación y otra para la acción de actualización y permitir espacios en blanco en la actualización.

validates :password, length: { in: 6..128 }, on: :create 
    validates :password, length: { in: 6..128 }, on: :update, allow_blank: true 

Con eso, estoy obteniendo el comportamiento que quiero y son solo dos líneas cortas de código.

Nota adicional:

Al principio, había tratado de esta manera:

validates :password, length: { in: 6..128 }, on: :create 

Esto es erróneo porque sería omitir la validación por completo de actualizaciones. Los usuarios podrían entonces configurar contraseñas cortas/largas (¿o en blanco?) Al actualizar la configuración.

3

Devise tiene su propio método para lograr eso, update_without_password, actualiza los atributos del registro sin pedir la contraseña actual. Nunca permite un cambio a la contraseña actual.

Nota. Si está utilizando este método, probablemente debe anular este método para proteger otros atributos que no le gustaría que se actualicen sin una contraseña.

Ejemplo:

def update_without_password(params={}) 
    params.delete(:email) 
    super(params) 
end 

Es todo en la Documentación Devise. http://rdoc.info/gems/devise/index

6

Agregue este código a su modelo de usuario.

private 
def password_required? 
    new_record? ? super : false 
end 
6

me trataron solución Amal Kumar S, pero por desgracia, no ayudó a solucionar el mismo problema, por lo que aquí es una versión modificada de la solución de prueba en proyecto real.

Aquí está el código de devise/models/validatable.Módulo rb

protected 

# Checks whether a password is needed or not. For validations only. 
# Passwords are always required if it's a new record, or if the password 
# or confirmation are being set somewhere. 
def password_required? 
    !persisted? || !password.nil? || !password_confirmation.nil? 
end 

La validación falla cuando salga de los campos de contraseña y confirmación de contraseña en blanco, mientras que la actualización de la información del usuario, porque esta condición siempre es falsa:

!password.nil? || !password_confirmation.nil? 

campos Contraseña y password_confirmation es igual cadena en blanco '', que nunca es igual a cero. Entonces, ¿puedes arreglar eso anulando la contraseña requerida? método en su modelo de usuario y cambio nulo? cheque en blanco? comprobar.

protected 

def password_required? 
!persisted? || !password.blank? || !password_confirmation.blank? 
end 

Creo que es la manera más fácil de solucionar eso y no arruina la lógica original. Tal vez es un error del ingenio.

+0

Pude usar esto para manejar mi caso de uso, omitiendo los requisitos de contraseña al agregar usuarios desde la consola (ya que estoy usando el módulo devise_invitable). Tuve que cambiar '! Persisted?' Por 'persisted?' Para lograrlo. –

Cuestiones relacionadas