Pregunta

Estoy agregando una característica de restablecimiento de contraseña de mi aplicación Rails que utiliza Authlogic. Estaba siguiendo la guía aquí: http: // www .binarylogic.com / 2008/11/16 / tutorial-reset-contraseñas-con-authlogic / y todo funciona como me gustaría excepto por una cosa: la forma de restablecimiento de contraseña acepta contraseñas en blanco y simplemente no lo hace cambiarlos.

He estado buscando alrededor, y han aprendido que este es el comportamiento predeterminado previsto, ya que le permite hacer el usuario editar formularios que sólo cambian la contraseña del usuario si entran en una nueva, y hacer caso omiso de lo contrario. Pero en este caso, yo quiero específicamente para hacer cumplir la validación de la contraseña como cuando un usuario se registra inicialmente. He encontrado dos soluciones posibles para este problema, pero no han sido capaces de encontrar la manera de poner en práctica cualquiera de ellos.

1) Alguien hizo esta misma pregunta en Grupos de Google:

blanco ahorra con contraseña en blanco

La respuesta de Ben era utilizar @user.validate_password = true a la validación de la fuerza de la contraseña. He intentado esto pero me da un error método no definido:. undefined method 'validate_password_field=' for #<User>

2) Parece que hay una opción de configuración llamada Authlogic ignore_blank_passwords. Está documentado aquí:

Módulo: Authlogic :: ActsAsAuthentic :: Contraseña :: Config # ignore_blank_passwords

Esto parece que podría funcionar, pero mi opinión es que se trata de una opción de configuración global que utiliza en su llamada acts_as_authentic inicial en el modelo del usuario, y no quiero cambiarlo de aplicaciones de todo, como yo tener un formulario de edición regular para los usuarios en el que necesito contraseñas en blanco para ser ignorado por defecto.

Cualquier persona encontró una solución a esto? Veo validate_password= en el registro de cambios de Authlogic 1.4.1 y nada de ello han sido retirados desde entonces. Simplemente estoy usando de manera incorrecta? ¿Hay una manera de utilizar ignore_blank_passwords sobre una base por-petición?

¿Fue útil?

Solución

Esto es lo que hice.

class User < ActiveRecord::Base
  attr_accessor :ignore_blank_passwords

  # object level attribute overrides the config level
  # attribute
  def ignore_blank_passwords?
    ignore_blank_passwords.nil? ? super : (ignore_blank_passwords == true)
  end
end

Ahora en su controlador, el atributo ignore_blank_passwords a falso.

user.ignore_blank_passwords = false

A continuación, se está trabajando dentro de los confines de AuthLogic. Usted no tiene que cambiar la lógica de validación.

Otros consejos

Esto es una especie de hilo de edad, pero ya que no se contesta voy a publicar esto.

he conseguido hacerlo un poco más limpia que las otras soluciones, "ayudar" validaciones authlogic con la mía.

I añadido este al usuario:

class User < ActiveRecord::Base

  ...

  attr_writer :password_required

  validates_presence_of :password, :if => :password_required?

  def password_required?
    @password_required
  end

  ...
end

Se puede reducirla a dos líneas al hacer una attr_accessor y el uso de :if => :password_required (sin interrogatorio), pero prefiero esta otra sintaxis con el signo de interrogación.

A continuación, el controlador de la acción se puede hacer así:

def update
  @user.password = params[:user][:password]
  @user.password_confirmation = params[:user][: password_confirmation]
  @user.password_required = true

  if @user.save
    flash[:notice] = "Password successfully updated"
    redirect_to account_url
  else
    render :action => :edit
  end
end

Esto tendrá un efecto local; el resto de la aplicación no se verá afectado (a menos password_required se establece en true en otros lugares, que es).

espero que ayude.

User.ignore_blank_passwords = false

El uso del modelo, no objeto de establecer esta propiedad.

def update_passwords
  User.ignore_blank_passwords = false
  if @user.update_attributes(params[:user])
    ...
  end
  User.ignore_blank_passwords = true
end

Tal vez probar el valor del parámetro en el controlador? (Código de aire):

def update
  @user.password = params[:user][:password]
  @user.password_confirmation = params[:user][: password_confirmation]
  if @user.password.blank?
    flash[:error] = "Password cannot be blank"
    render :action => :edit
    return
  end
  if @user.save
    flash[:notice] = "Password successfully updated"
    redirect_to account_url
  else
    render :action => :edit
  end
end

Además de la solución de Zetetic que podría hacerlo de esta manera:

def update
  @user.password = params[:user][:password]
  @user.password_confirmation = params[:user][: password_confirmation]

  if @user.changed? && @user.save
    flash[:notice] = "Password successfully updated"
    redirect_to account_url
  else
    render :action => :edit
  end
end

Básicamente, se está comprobando si authlogic cambió el registro de usuario (que no lo hace si la contraseña está vacía). En el bloque else se puede comprobar si la contraseña estaba en blanco y añadir un mensaje de error apropiado para el registro de usuario o muestre un mensaje flash.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top