2010-11-04 3 views
12

J'ai mis en place omniauth avec mon modèle d'invention, donc je peux m'authentifier en utilisant d'autres services. Mot de passe n'est plus nécessaire pour mon modèle, comme les utilisateurs peuvent s'authentifier en utilisant twitter, facebook ...Rails 3 - Devise: comment ignorer le mot de passe courant lors de la modification d'un enregistrement?

Tout fonctionne bien, mais, quand un utilisateur essaie de modifier son enregistrement, concevoir sauter le processus parce que l'utilisateur n'a pas informez le mot de passe 'current_password' (qui n'existe pas dans certains cas maintenant).

J'ai créé un contrôleur d'enregistrement pour remplacer les chapes un:

class RegistrationsController < Devise::RegistrationsController 
    def update 
    super 
    end 
end 

Mais je trouve aucune documentation sur la façon de sauter la vérification de mot de passe, comment pourrais-je faire dans mon action de mise à jour?

Répondre

34

Tout comme ci-dessus, essayez de mettre dans votre modèle utilisateur:

# bypasses Devise's requirement to re-enter current password to edit 
def update_with_password(params={}) 
    if params[:password].blank? 
    params.delete(:password) 
    params.delete(:password_confirmation) if params[:password_confirmation].blank? 
    end 
    update_attributes(params) 
end 
+0

vraiment agréable. fonctionne parfaitement! – Tronic

+0

Cela fonctionne! Merci je t'aime! – rodrigoalves

+4

Il peut être utile d'ajouter un appel à 'clean_up_passwords'. Après l'enregistrement, il définit les attributs 'password' et' password_confirmation' à zéro pour garder le mot de passe de l'utilisateur secret. Voir l'implémentation de [update_with_password] de Devise (https://github.com/plataformatec/devise/blob/master/lib/devise/models/database_authenticatable.rb#L56) pour référence. –

10

Ce qui suit a fonctionné pour moi:

Dans mon contrôleur utilisateurs, dans l'action de mise à jour, je

params[:user].delete(:password) if params[:user][:password].blank? 
params[:user].delete(:password_confirmation) if params[:user][:password_confirmation].blank? 

Peut-être que vous pourriez adapter à un rappel que before_save?

1

Même la réponse a été ici pendant un certain temps, je veux poster un nouveau, comme je pense que la réponse choisie a un peu de défauts . Peut-être qu'il n'a pas à l'heure actuelle, la réponse a été créé, mais maintenant 2013, la réponse serait comme ceci:

La solution serait de créer dans User modèle comme celui-ci:

# bypass re-entering current password for edit 
    def update_with_password(params={}) 
    current_password = params.delete(:current_password) 

    if params[:password].blank? 
     params.delete(:password) 
     params.delete(:password_confirmation) if params[:password_confirmation].blank? 
    end 
    update_attributes(params) 

    clean_up_passwords 
    end 
+0

Mais que serait la méthode de mise à jour de RegistrationsController #? –

+0

Rien. Le contrôleur d'enregistrement ne doit pas être créé du tout. La solution serait de créer SEULEMENT dans le modèle de l'utilisateur comme je l'ai mis dans ma réponse et de ne pas créer de classes supplémentaires comme il est dit dans la question. – Aleks

0

il est une réponse plus facile, je ne sais pas quand la première a concevoir cette méthode, mais en ajoutant simplement

Model.update_without_password(params)

il mettra à jour les attributs sans avoir besoin d'un mot de passe en cours.

Questions connexes