So aktualisieren Sie Benutzerinformationen in Devise, ohne Ihr aktuelles Kennwort einzugeben.
OS : macOS Mojave 10.14.6
ruby : 2.6.5p114
rails : 5.2.4
devise : 4.7.1
Angenommen, Sie haben die Schritte von der Installation des Edelsteins bis zur Erstellung der Ansicht bereits ausgeführt.
[STEP1. Fügen Sie einen starken Parameter für die neue Registrierung zu application_controller
hinzu]
(# Festlegen starker Parameter für die neue Registrierung)
[SCHRITT 2. Erstellen Sie "registrations_controller.rb" in "controller / users /", fügen Sie starke Parameter zum Aktualisieren hinzu, korrigieren Sie das Routing](# Aktualisieren Sie die Einstellungen für starke Parameter)
[SCHRITT 3. Beschreiben Sie die Methode zum Aktualisieren ohne Kennwort in "registrations_controller.rb" und "user.rb".](# Definieren Sie die Methode zum Aktualisieren ohne Kennwort.)
[SCHRITT 4. Entfernen Sie das Feld current_password aus der Ansicht](Entfernen Sie das Feld current_password aus der Datei #view.)
Derzeit wird der später hinzugefügte Namensparameter durch den starken Parameter abgestoßen. Geben Sie den folgenden Code in application_controller ein.
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
Wenn Sie dies auf der Konsole überprüfen, können Sie den Parameter name erhalten und einen Benutzer erstellen.
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">
Als nächstes setzen Sie das Eingabefeld des Namens in Sicht.
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>
//hinzufügen
<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" %>
Damit ist die Registrierung neuer Benutzer abgeschlossen.
Fügen Sie dann der Benutzerbearbeitungsansicht auch ein Namensfeld hinzu.
html:edit.html.erb
//hinzufügen
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name, autofocus: true, autocomplete: "name" %>
</div>
Sie können sehen, dass durch Drücken der Aktualisierungstaste hier der Name nicht aktualisiert wird.
Erstellen Sie daher "users / registrations_controller.rb", um die Namensspalte zu aktualisieren und wie folgt zu schreiben.
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
Ändern Sie dann das Routing, um auf diesen registartions_controller
zu verweisen.
routes.rb
Rails.application.routes.draw do
root 'blogs#index'
#Änderungen
devise_for :users, controllers: {
registrations: 'users/registrations'
}
resources :blogs
end
Dann kann die Spalte Name der Benutzer aktualisiert werden.
Wenn Sie jedoch derzeit nicht das aktuelle Kennwort eingeben, tritt während der Aktualisierung ein Fehler auf.
Definieren Sie zunächst eine Methode zum Aktualisieren des Benutzermodells ohne Kennwort.
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
//Methode zum Hinzufügen
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
Rufen Sie dann "update_without_password" von "registrations_controller" auf.
registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
before_action :configure_account_update_params, only: [:update]
protected
//hinzufügen(Verpflichtend)
def update_resource(resource, params)
resource.update_without_password(params)
end
//Eine Methode, die nach einem Update zum oberen Bildschirm umleitet, obwohl dies nicht erforderlich ist
def after_update_path_for(_resource)
blogs_path
end
def configure_account_update_params
devise_parameter_sanitizer.permit(:account_update, keys: [:name])
end
end
Entfernen Sie "current_password" aus der Ansichtsdatei.
html:edit.html.erb
//Löschen
<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>
Sie können sehen, dass der Benutzername fehlerfrei aktualisiert wurde.
Recommended Posts