[RUBY] Comment mettre à jour les modifications utilisateur dans Rails Devise sans entrer de mot de passe

Comment mettre à jour les modifications utilisateur dans Rails Devise sans entrer de mot de passe

Voici comment mettre à jour les informations utilisateur dans Devise sans entrer votre mot de passe actuel.

table des matières

Environnement d'exploitation

OS : macOS Mojave 10.14.6 ruby : 2.6.5p114 rails : 5.2.4 devise : 4.7.1

Conditions préalables

Supposons que vous ayez déjà terminé les étapes de l'installation du gem à la création de la vue.

  1. concevoir un bijou installé
  2. les rails génèrent un appareil installé
  3. les rails génèrent un modèle: vues terminées
  4. Des colonnes autres que celles par défaut telles que le nom ont été ajoutées à la table des utilisateurs

Aperçu de la procédure

[ÉTAPE1. Ajout d'un paramètre fort pour un nouvel enregistrement dans ʻapplication_controller`] (# Définition de paramètres forts pour un nouvel enregistrement)

[ÉTAPE2. Créez registrations_controller.rb dans controllers / users /, ajoutez des paramètres forts à mettre à jour, corrigez le routage](# mettre à jour les paramètres forts)

[ÉTAPE3. Décrivez la méthode de mise à jour sans mot de passe dans registrations_controller.rb et ʻuser.rb`](#Définissez la méthode de mise à jour sans mot de passe)

[ÉTAPE4. Supprimez le champ current_password de la vue](Supprimez le champ current_password du fichier #view)

Procédure détaillée

Définition de paramètres forts pour un nouvel enregistrement

Actuellement, le paramètre de nom ajouté ultérieurement est repoussé par le paramètre strong. Placez le code suivant dans application_controller.

application_controller.rb


class ApplicationController < ActionController::Base
 before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end
end

Si vous le cochez sur la console, vous pouvez recevoir le paramètre de nom et créer un utilisateur.

irb(main):001:0> User.create(name: 'abc' , email:'[email protected]',password:'123456')
   (1.3ms)  COMMIT
=> #<User id: 2, email: "[email protected]", created_at: "2020-05-30 10:41:46", updated_at: "2020-05-30 10:41:46", name: "abc">

Ensuite, mettez le champ de saisie du nom en vue.

html:new.html.erb


<h2>Sign up</h2>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= render "devise/shared/error_messages", resource: resource %>

<div class="field">
  <%= f.label :email %><br />
  <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>

//ajouter à
<div class="field">
  <%= f.label :name %><br />
  <%= f.text_field :name, autofocus: true, autocomplete: "name" %>
</div>

<div class="field">
  <%= f.label :password %>
  <% if @minimum_password_length %>
  <em>(<%= @minimum_password_length %> characters minimum)</em>
  <% end %><br />
  <%= f.password_field :password, autocomplete: "new-password" %>
</div>

<div class="field">
  <%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation, autocomplete: "new-password" %>
</div>

<div class="actions">
  <%= f.submit "Sign up" %>
</div>
<% end %>

<%= render "devise/shared/links" %>

Ceci termine l'enregistrement du nouvel utilisateur.

Définition de paramètres forts pour les mises à jour

Ensuite, ajoutez également un champ de nom à la vue d'édition utilisateur.

html:edit.html.erb


//ajouter à
<div class="field">
  <%= f.label :name %><br />
  <%= f.text_field :name, autofocus: true, autocomplete: "name" %>
</div>

Vous pouvez voir que le fait d'appuyer sur le bouton de mise à jour ici ne met pas à jour le nom.

Par conséquent, créez ʻusers / registrations_controller.rb` pour mettre à jour la colonne de nom, et écrivez comme suit.

registrations_controller.rb


class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_account_update_params, only: [:update]

  protected

  def configure_account_update_params
    devise_parameter_sanitizer.permit(:account_update, keys: [:name])
  end
end

Puis modifiez le routage pour faire référence à ce registartions_controller.

routes.rb


Rails.application.routes.draw do
  root 'blogs#index'
  #changements
  devise_for :users, controllers: {
    registrations: 'users/registrations'
  }
  resources :blogs
  end

Ensuite, la colonne Nom des utilisateurs peut être mise à jour.

Définir une méthode de mise à jour sans mot de passe

Cependant, pour le moment, si vous n'entrez pas le mot de passe courant, une erreur se produira lors de la mise à jour. image.png

Donc, tout d'abord, définissez une méthode pour mettre à jour le modèle utilisateur sans mot de passe.

user.rb


class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  //Méthode à ajouter
  def update_without_current_password(params, *options)
    params.delete(:current_password)

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

    result = update_attributes(params, *options)
    clean_up_passwords
    result
  end
end

Appelez ensuite ʻupdate_without_password depuis registrations_controller`.

registrations_controller.rb


class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_account_update_params, only: [:update]

  protected
  //ajouter à(Obligatoire)
  def update_resource(resource, params)
    resource.update_without_password(params)
  end

  //Une méthode qui redirige vers l'écran supérieur après une mise à jour, bien qu'elle ne soit pas obligatoire
  def after_update_path_for(_resource)
    blogs_path
  end

  def configure_account_update_params
    devise_parameter_sanitizer.permit(:account_update, keys: [:name])
  end
end

Supprimer le champ current_password du fichier de vue

Supprimez current_password du fichier de vue.

html:edit.html.erb


//Effacer
<div class="field">
  <%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
  <%= f.password_field :current_password, autocomplete: "current-password" %>
</div>

résultat

image.png

Vous pouvez voir que le nom d'utilisateur a été mis à jour sans aucune erreur.

image.png

Recommended Posts

Comment mettre à jour les modifications utilisateur dans Rails Devise sans entrer de mot de passe
Comment mettre à jour les informations utilisateur sans mot de passe
C'était étonnamment facile. Comment mettre à jour les informations utilisateur sans entrer de mot de passe
Comment insérer une vidéo dans Rails
[Rails] Comment obtenir les informations sur l'utilisateur actuellement connecté avec devise
Comment implémenter une fonctionnalité similaire dans Rails
Comment créer facilement un pull-down avec des rails
Comment implémenter une fonctionnalité intéressante dans Ajax avec Rails
Introduire la conception avec Rails pour implémenter la fonctionnalité de gestion des utilisateurs
[Comment insérer une vidéo dans un hameau avec Rails]
Comment écrire une recherche de comparaison de dates dans Rails
[Rails 6] Comment définir une image d'arrière-plan dans Rails [CSS]
[Rails] Comment charger JavaScript dans une vue spécifique
Comment afficher des graphiques dans Ruby on Rails (LazyHighChart)
Super facile en 2 étapes! Comment installer la devise! !! (version rails 5)
[Rails] Comment utiliser la "devise" des gemmes
[Rails] Comment utiliser l'appareil (Remarque)
[Rails] [Devise] Modifier le profil sans saisir de mot de passe
Comment installer jQuery dans Rails 6
Comment installer Swiper in Rails
Comment renommer un modèle avec des contraintes de clé externes dans Rails
[Rails 5] Comment afficher l'écran de changement de mot de passe lors de l'utilisation de l'appareil
Comment implémenter la fonctionnalité de recherche dans Rails
Comment changer le nom de l'application dans les rails
[rails] Comment configurer le routage dans les ressources
[rails] Comment créer un modèle partiel
Comment implémenter la fonctionnalité de classement dans Rails
[Note] Comment utiliser Rails 6 Devise + cancancan
Comment publier une bibliothèque dans jCenter
Comment utiliser credentials.yml.enc introduit à partir de Rails 5.2
[Rails] Comment traduire la devise en japonais
Comment mettre en œuvre un diaporama en utilisant Slick in Rails (un par un et plusieurs par un)
[Rails] Utilisez le dispositif pour obtenir des informations sur l'utilisateur actuellement connecté
[Rails] Comment passer la validation telle que le mot de passe lors de l'exécution d'une action de mise à jour
[Ruby on Rails] Comment se connecter avec seulement votre nom et mot de passe en utilisant le bijou
Rails: comment bien écrire une tâche de râteau
Convertir en balise dans la chaîne d'URL avec Rails
[Rails] Comment écrire lors de la création d'une sous-requête
[Rails] Comment créer un graphique à l'aide de lazy_high_charts
Comment afficher une page Web en Java
[Rails] Comment utiliser les boîtes de sélection dans Ransack
Comment obtenir l'ID d'un utilisateur qui s'est authentifié avec Firebase dans Swift
[Rails6] Comment connecter la fonction d'affichage générée par Scaffold avec la fonction utilisateur générée par devise
Comment exécuter une tâche djUnit dans Ant
Comment ajouter un chemin de classe dans Spring Boot
Comment mettre à jour un fichier prédéfini dans un conteneur Docker
Comment créer un thème dans Liferay 7 / DXP
Comment séparer .scss par contrôleur dans Rails
Comment ajouter conditionnellement une classe html.erb dans Rails
Comment stocker simultanément des données dans un modèle associé à une forme imbriquée (Rails 6.0.0)