cambio de contraseña con authlogic – la validación no captura entradas en blanco

Estoy intentando crear un formulario para permitir a los usuarios cambiar su contraseña:

Ver:

- form_tag change_password_users_path do = error_messages_for :user, :header_message => "Please Try Again", :message => "We had some problems updating your account" %br = label_tag :password, "New password:" = password_field_tag "password" %br = label_tag :password_confirmation, "NConfirm new password:" = password_field_tag "password_confirmation" %br = submit_tag "Update Account" 

Controlador:

 def change_password @user = current_user if request.post? @user.password = params[:password] @user.password_confirmation = params[:password_confirmation] if @user.save redirect_to user_path(current_user) else render :action => "change_password" end end end 

Authlogic está detectando errores de validación cuando la contraseña es ‘demasiado corta’ o la contraseña no coincide con la confirmación, pero no hace nada cuando se envía el formulario con ambos campos en blanco. @ user.save debe devolver verdadero, porque me redireccioné a ‘user_path (current_user)’.

La contraseña no se cambia realmente en la base de datos.

Gracias por tu ayuda.

Te sugiero que llames a @ user.changed? como el siguiente ejemplo para verificar contraseñas en blanco:

 def change_password @user = current_user if request.post? @user.password = params[:user][:password] @user.password_confirmation = params[:user][:password_confirmation] if @user.changed? && @user.save redirect_to user_path(current_user) else render :action => "change_password" end end end 

Creo que también debes proporcionar los parámetros [: usuario] [: contraseña actual], de lo contrario no puedes guardar el @usuario. Y cuando hice la prueba, encontré que el usuario actual se perderá después de cambiar la contraseña, por lo que necesita actualizar la sesión de usuario.

Agregue un acceso ‘current_password’ a su modelo de usuario

 class User < ActiveRecord::Base act_as_authentic attr_accessor :current_password end 

En el controlador de usuario

 def change_password @user = current_user if @user.valid_password? params[:user][:current_password] @user.password = params[:user][:password] @user.password_confirmation = params[:user][:password_confirmation] if @user.changed? && @user.save UserSession.create(:login => @user.login, :password => params[:user][:password]) redirect_to user_path(current_user) else render :action => "change_password" end end end 

Aparentemente este es el comportamiento pretendido.

http://www.ruby-forum.com/topic/198836

Al menos ahora lo sé …

Gracias.

Otra forma de hacerlo es explotar los contextos de validación de ActiveModel. Deberá agregar una validación dependiente del contexto a su modelo de usuario:

 validates :password, # :password_confirmation, :presence => {:message => 'Please enter your new password.'}, :on => :reset_password 

Entonces, en el controlador será justo:

 def change_password @user = current_user if request.post? @user.password = params[:password] @user.password_confirmation = params[:password_confirmation] if @user.save(:context => :reset_password) redirect_to user_path(current_user) else render :action => "change_password" end end end 

Espero que se adapte a los que no estaban satisfechos con otras soluciones sugeridas.