79 votes

Devise mettre à jour l'utilisateur sans mot de passe

Je souhaite mettre à jour les attributs des utilisateurs sans mot de passe dans le système. Le cas est comme, si les champs mot de passe et confirmation de mot de passe ne sont pas vides alors j'ai besoin d'une erreur de conception et s'ils sont vides alors les autres attributs de l'utilisateur doivent être mis à jour. Comment est-ce que je pourrais faire ceci avec la devise?

Merci d'avance!

95voto

John Points 1002

Je pense que c'est une bien meilleure solution:

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

Cela vous évite de devoir modifier le contrôleur Devise en supprimant simplement le champ de mot de passe de la réponse au formulaire s'il est vide.

Assurez-vous simplement de l'utiliser avant @user.attributes = params[:user] ou quoi que vous utilisiez dans votre action update pour définir les nouveaux paramètres du formulaire.

66voto

Dty Points 7756

Est-ce ce que vous cherchez? Du wiki Devise

Autoriser les utilisateurs à modifier leur compte sans fournir de mot de passe

Cela montre comment faire pour les rails 3 et 4

========================

La solution de John est une alternative plus simple

21voto

Duncan Robertson Points 153

Je pense qu'avec Devise 3.2+, vous pouvez simplement remplacer update_resource dans votre contrôleur sous-classé. Voici un exemple de la question posée à l'origine:

 class MyRegistrationsController < Devise::RegistrationsController
  protected

  def update_resource(resource, params)
    resource.update_without_password(params)
  end
end
 

8voto

Mikhail Grishko Points 1417

J'ai résolu ce problème comme suit: si le formulaire est soumis avec un mot de passe, vous devez remplir le champ mot_de_passe ou le formulaire mis à jour sans mot de passe ni mot_de_passe.

dans le modèle:

 class User
  devise: bla-bla-bla

  attr_accessor :current_password
end
 

Dans le contrôleur:

 class Users::RegistrationsController <  Devise::RegistrationsController
  layout 'application'


   def update
    self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)


    # custom logic
    if params[:user][:password].present?
      result = resource.update_with_password(params[resource_name])
    else
      result = resource.update_without_password(params[resource_name])
    end

    # standart devise behaviour
    if result
      if is_navigational_format?
        if resource.respond_to?(:pending_reconfirmation?) && resource.pending_reconfirmation?
          flash_key = :update_needs_confirmation
        end
        set_flash_message :notice, flash_key || :updated
      end
      sign_in resource_name, resource, :bypass => true
      respond_with resource, :location => after_update_path_for(resource)
    else
      clean_up_passwords resource
      respond_with resource
    end
  end
end
 

3voto

Ryan Burnette Points 100

Je résous ce problème avec mon interface. Je ne montre pas les champs de mot de passe, sauf si l'utilisateur indique qu'il souhaite mettre à jour le mot de passe. Cela ne nécessite aucune mise à jour dans l'application elle-même.

Voici un exemple dans jQuery.

 function () {
  var $passwordGroup = $('.form-group.password-group').wrap('<div class="password-group-location"></div>').remove()
    , $passwordGroupLocation = $('.password-group-location')
    , $changePasswordButton = $('input#update_password')
    ;

  $changePasswordButton.on('change', function () {
    if ( $(this).is(':checked') ) {
      $passwordGroupLocation.append($passwordGroup);
    }
    else {
      $passwordGroupLocation.html('');
    }
  });
};
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X