0
Help us understand the problem. What are the problem?

posted at

【Rails / devise】ユーザー編集機能の実装(「現在のパスワード入力」の設定を無くす方法)

初めに

このような方におすすめの記事です

・devise ユーザー編集の方法を知りたい
・デフォルトの「現在のパスワード」を入力せずにデータをアップデートしたい

前提

・deviseを導入済(インストール〜モデル作成まで)
・編集機能のレイアウトを作成済

以下の記事を参考に導入しています。

[Devise] パスワードを入力せずにユーザー情報を編集する
Deviseでパスワードの入力無しでユーザー情報の更新をする方法

手順

①deviseのコントローラーを作成する

ターミナル

rails generate devise:controllers users

②作成された以下のファイルに追記する

app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
  
#省略

  protected

  def update_resource(resource, params)
    resource.update_without_current_password(params)
  end
 #省略
end

③コントローラーに編集したデータをアップデートする時に保存を許可するカラムを追加する

app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  private

  def configure_permitted_parameters
    # 新規登録時に保存を許可するカラムを追加する
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :image, :profile])
    # 編集したデータをアップデートする時に保存を許可するカラムを追加する
    devise_parameter_sanitizer.permit(:account_update, keys: [:name, :image, :profile])
  end
end

④current_passwordフォームを削除する

<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>

うまくいかなかった記述

今回手順②で以下の記述を

app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
  
#省略

  protected

  def update_resource(resource, params)
    resource.update_without_current_password(params)
  end
 #省略
end

↓「current」がない記述にすると、変更したいパスワードを入力しても保存されなくなってしまいました。

app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
  
#省略

  protected

 def update_resource(resource, params)
    resource.update_without_password(params)  #こちらにcurrentの記述がない
  end
 #省略
end

今回は「現在のパスワードのみ」を無くしたかったので、currentの記述を追加したことで正常にデータをアップデート(保存)できるようになりました。
自分の用途に合わせて使用していきたいと思います。

参考:最終的なビュー

【新規登録】【編集】deviseが初期から保存するもの以外では以下のカラムを追加しています。
・image(CarrierWave使用)
 →設定を別に追加することなく、今回の方法で画像も編集できました
・name
・profile(自己紹介)

app/views/devise/registrations/edit.html.erb
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
 <%= render 'shared/error_messages', model: f.object %> 

  <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="field">
       <%= f.label :image, "プロフィール画像" %><br/>
       <%= f.file_field :image %>
    </div>

    <div class="field">
       <%= f.label :name, "ユーザー名(10文字以内)" %>
       <%= f.text_field :name %>
    </div>

     <div class="field">
        <%= f.label :profile, "プロフィール"%><br />
        <%= f.text_area :profile, class: :form__text, id:"user_profile"%>
    </div>

     <div class="login__attention">
       <span>●</span>変更のために現在のパスワードをご入力ください
       <br />
       <span>●</span>パスワードを変更される場合は新しいパスワードをご入力ください
       <br />
    </div>

    <div class="field">
         <div class="field__flex">
         <%= f.label :password, "パスワード(英数字6文字以上)" %>
          <div class="need">必須</div><br />
          </div>
           <%= f.password_field :password, autocomplete: "new-password" %>
   </div>

         <div class="field">
            <div class="field__flex">
            <%= f.label :password_confirmation, "パスワード再入力" %>
            <div class="need">必須</div><br />

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

            <div class="actions">
              <%= f.submit "変更する", class: :form__btn %>
            </div>
          <% end %>

まとめ

最後までご覧くださり、ありがとうございました。
初学者のため、記入漏れや記述ミスがありましたら教えていただけると助かります。

こちらの記事が誰かのお役に立てれば幸いです。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?