ruby (2.6.5) rails(6.0.0) devise (4.7.2)
Tout d'abord, spécifiez la destination du lien afin que l'édition des utilisateurs / inscriptions # routés soit exécutée.
Prefix Verb URI Pattern Controller#Action
edit_user_registration GET /users/edit(.:format) users/registrations#edit
Comme décrit ci-dessous.
<%= link_to 'Ma page', edit_user_registration_path(current_user), class: "user-nickname" %>
Étant donné que la fonction de mise à jour des données sans mot de passe est implémentée dans le contrôleur de l'appareil, Générez un contrôleur de périphérique dans le terminal.
$ rails g devise:controllers users
Modifiez le RegistrationsController généré comme suit.
app>controllers>users>registrations_controlle.rb
class Users::RegistrationsController < Devise::RegistrationsController
before_action :configure_account_update_params, only: [:update]
protected
def update_resource(resource, params)
resource.update_without_password(params)
end
def after_update_path_for(_resource)
root_path
end
def configure_account_update_params
devise_parameter_sanitizer.permit(:account_update, keys: [:nickname])
end
end
Je mets à jour avec update_resource sans mot de passe. After_update_path_for spécifie la destination de la redirection après la mise à jour. Dans configure_account_update_params, cette fois, seule la colonne appelée surnom dans la table User est autorisée à être mise à jour.
Voir le wiki officiel pour plus de détails. https://github.com/heartcombo/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password
Générez un fichier de vue de l'appareil dans le terminal.
$ rails g devise:views
Modifiez edit.html.view du fichier de vue généré afin qu'il ne contienne que le formulaire d'entrée requis.
erb:app>views>devise>registrations>edit.html.erb
<h2>Edit <%= resource_name.to_s.humanize %></h2>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
<%= render "devise/shared/error_messages", resource: resource %>
<div class="field">
<%= f.label :nickname %><br />
<%= f.text_field :nickname, autofocus: true, autocomplete: "nickname" %>
</div>
<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>
<% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
<div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
<% end %>
<div class="actions">
<%= f.submit "Update" %>
</div>
<% end %>
Modifiez comme suit et spécifiez le contrôleur au moment de l'inscription.
routes.rb
devise_for :users, controllers: {
registrations: 'users/registrations'
}
Lors de la mise à jour, veillez à ne pas être frappé par la validation du mot de passe Il est ajouté comme on :: create. Avec cette description, la validation du mot de passe ne sera appliquée que lorsque l'action de création est exécutée.
app>models>user.rb
with_options presence: true do
validates :nickname, :birthday
validates :email, uniqueness: true
validates :first_name, :last_name, format: { with: regexp_name }
validates :first_name_read, :last_name_read, format: { with: regexp_name_read }
validates :password, format: { with: regexp_password }, on: :create
end
En implémentant ce qui précède, nous avons pu mettre à jour le tableau du modèle utilisateur de l'appareil sans mot de passe. Merci de visiter notre site.