Voici comment mettre à jour les informations utilisateur dans Devise sans entrer votre mot de passe actuel.
OS : macOS Mojave 10.14.6
ruby : 2.6.5p114
rails : 5.2.4
devise : 4.7.1
Supposons que vous ayez déjà terminé les étapes de l'installation du gem à la création de la vue.
[É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)
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.
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.
Cependant, pour le moment, si vous n'entrez pas le mot de passe courant, une erreur se produira lors de la mise à jour.
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
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>
Vous pouvez voir que le nom d'utilisateur a été mis à jour sans aucune erreur.