Je cherche un moyen de permettre aux utilisateurs de modifier leurs paramètres (modèle utilisateur) sans avoir à modifier leur mot de passe (ils doivent toujours entrer leur mot de passe actuel). Devise de la boîte semble permettre cela, mais lorsque vous supprimez le module validable et la configuration des validations personnalisées, il semble que vous devez parcourir un peu.
J'ai configuré la validation suivante dans mon modèle utilisateur: p> Lorsque vous vous inscrivez, l'utilisateur est tenu de spécifier son mot de passe (ce qui est ce que j'attends). Lors de la mise à jour des paramètres, si je laissez le mot de passe en blanc, il augmente une erreur à l'utilisateur indiquant que le mot de passe doit comporter au moins 6 caractères. p> Comment puis-je contourner cela sans avoir à modifier la voie à la mode Fonctionne ou à mettre en œuvre un contrôleur personnalisé d'une sorte? P> P>
4 Réponses :
Peut-être que cela ressemblera évident pour certains, mais cela m'a pris un certain temps. Après quelques heures d'essais de solutions différentes et de solutions de contournement et à la recherche partout, j'ai entendu des validations de rails et j'ai trouvé quelques constructions qui, lorsqu'elles sont rassemblées, rendez-la vraiment facile.
Tout ce que je devais faire a été d'installer une validation pour l'action Créer et une pour l'action de mise à jour et autoriser les blancs sur la mise à jour. p> avec cela, je reçois le comportement que je veux et ce n'est que deux courtes lignes de Code. p> Remarque supplémentaire: strong> P> Au début, j'avais essayé de cette façon: P> validates :password, length: { in: 6..128 }, on: :create
Devise a sa propre méthode pour atteindre cela, update_without_password , il met à jour les attributs d'enregistrement sans demander le mot de passe actuel. Ne permet jamais de changer le mot de passe actuel.
Exemple: def update_without_password(params={})
params.delete(:email)
super(params)
end
Ajoutez ce code à votre modèle utilisateur.
private def password_required? new_record? ? super : false end
J'ai essayé la solution d'Amal Kumar S, mais malheureusement, cela ne m'a pas aidé à résoudre le même problème. Voici donc une version modifiée de solution testée dans le projet réel.
Voici le code de Devise / Modèles / validable. Module RB P>
protected def password_required? !persisted? || !password.blank? || !password_confirmation.blank? end
J'ai pu utiliser cela pour gérer mon étui d'utilisation, sauter des exigences de mot de passe lorsque vous ajoutez des utilisateurs de la console (puisque j'utilise le module Devise_Invitable). Je devais changer ! Persisté? Code> to persisté? Code> pour accomplir cela.