2009-11-18 4 views
4

Je suis en train de créer un formulaire pour permettre aux utilisateurs de changer leur mot de passe:changer le mot de passe avec authlogic - validation ne pas attraper entrées vides

Vue:

- 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" 

Controller:

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 détecte des erreurs de validation lorsque le mot de passe est "trop ​​court" ou le mot de passe ord ne correspond pas à la confirmation, mais ne fait rien lorsque le formulaire est soumis avec les deux champs vides. @ user.save doit renvoyer la valeur true, car je suis redirigé vers 'user_path (current_user)'.

Le mot de passe n'est pas réellement modifié dans la base de données.

Merci pour votre aide.

+0

Juste une pensée, pouvez-vous ouvrir le débogueur sous 'if @ user.save' et essayer de sauvegarder l'enregistrement manuellement, puis utiliser @ user.changes? – btelles

+0

La commande serait "ruby script/server --debugger" – btelles

+0

Publier le modèle? –

Répondre

1

Je vous suggère d'appeler @ user.changed? comme dans l'exemple ci-dessous pour vérifier les mots de passe vides:

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 
2

Je pense que vous devez également fournir les params [:] [utilisateur: current_password], sinon vous ne pouvez pas enregistrer le @user. Et quand j'ai testé, j'ai trouvé le current_user sera perdu après avoir changé le mot de passe, donc vous devez mettre à jour usersession.

Ajouter un accesseur 'de current_password' à votre modèle utilisateur

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

Dans le contrôleur utilisateur

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 
+0

Je reçois 'NoMethodError: méthode non définie 'current_password =' ​​pour # '. Y a-t-il un autre endroit où vous ajoutez cet attribut? –

+0

Vous devrez ajouter 'attr_accessor: current_password' à votre modèle utilisateur. – jwarzech

0

Une autre façon de le faire est d'exploiter des contextes de validation ActiveModel. Vous aurez besoin d'ajouter une validation dépendant du contexte de votre modèle d'utilisateur:

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

Ensuite, dans le contrôleur, il sera juste:

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 

espérons qu'il SUÍTE ceux qui ne sont pas satisfaits avec d'autres solutions suggérées

Questions connexes