2011-07-01 21 views
29

Tengo un controlador personalizado que maneja la edición de contraseñas de usuario basadas en el código here.Idear no validar contraseña/contraseña de confirmación

usuario Modelo

attr_accessible :password, :password_confirmation, :username, :login 
... 
devise :database_authenticatable, 
     :lockable, 
     :registerable, 
     :recoverable, 
     :rememberable, 
     :trackable 

PasswordsController

expose(:user) { current_user } 

def update 
    if user.update_with_password(params[:user]) 
    sign_in(user, :bypass => true) 
    flash[:notice] = "success" 
    else 
    render :edit 
    end 
end 

Mi formulario de edición de contraseña se encuentra here.

El problema es que no importa lo que ingrese (o no escriba para el caso) en el formulario de edición de contraseña, se muestra el método flash "éxito".

+0

¿Funciona todo cómo debería? si el campo de confirmación no coincide o current_password está equivocado, ¿no cambia la contraseña? – Dex

+0

Todavía lo cambia a lo que está en: contraseña independientemente de qué (si hay algo) está en: contraseña_confirmación. –

+0

qué sucede si cambia la instrucción if a 'si params [: usuario] [: contraseña] == params [: usuario] [: contraseña_confirmación]' y coloca 'user.update_with_password (params [: user])' en el cuerpo ? –

Respuesta

62

Si desea que Devise haga validaciones, debe agregar el módulo :validatable a su modelo. Esto es bastante fácil de hacer, sólo tiene que añadir a la lista :validatable del módulo en la llamada devise, por lo que su modelo dice:

devise 
    :database_authenticatable, 
    :lockable, 
    :registerable, 
    :recoverable, 
    :rememberable, 
    :trackable, 
    :validatable 

Esto hará legado añadir validaciones.

Otra manera fácil es agregar sus propias validaciones. Si lo que desea es validar que la confirmación de la contraseña coincide, puede agregar una validación validates_confirmation_of añadiendo esto a su modelo:

validates_confirmation_of :password 

espero que esto ayude.

+1

'validates_confirmation_of: password' era lo que me faltaba –

1

encuentre su objeto para la actualización en el controlador.

user = User.find_by_id(params[:id]) 
    unless user.blank? 
     if user.update_attributes(params[:user]) 
     flash[:notice] = "User updated successfully." 
     redirect_to "somwhere" 
     else 
     render :action => 'edit' 
     end 
    else 
     render :action => 'edit' 
    end 

si no desea actualizar la contraseña a continuación, añadir estas líneas antes de updation por lo que el nuevo código será:

user = User.find_by_id(params[:id]) 
     unless user.blank? 
      params[:user].delete(:password) if params[:user][:password].blank? 
      params[:user].delete(:password_confirmation) if params[:user][:password_confirmation].blank? 
if user.update_attributes(params[:user]) 
      flash[:notice] = "User updated successfully." 
      redirect_to "somwhere" 
      else 
      render :action => 'edit' 
      end 
     else 
      render :action => 'edit' 
     end 

somthing escritura como esto en el modelo user.rb

devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :locakable 
4

creo que se olvidó de inicializar parámetro fuertes en application_controller.rb en los carriles 4

before_action: configure_permitted_parameters, si:: devise_controller? protected

def configure_permitted_parameters  
    devise_parameter_sanitizer.for(:sign_up){|u|u.permit(:email,:password,:password_confirmation)} 
end 
+1

Eso es lo que me mordió, se me olvidó agregar' password_confirmation' a la lista de parámetros desinfectados, ¡gracias! – hernandes

Cuestiones relacionadas