Rails Deviseでユーザー編集を現在のパスワードを入力しないで更新する


個人の備忘録

#背景
railsでユーザー登録のためにdeviseを使った簡単なプリを作成中に編集画面で
現在のパスワードを入れないで更新できないかと考えたため。

環境

rails 5.2.3
ruby 2.6.3

まずdeviseを用いた際のルーティングを確認

config/routes.rb
devise_for :users, controllers: {
        registrations: 'users/registrations',
        sessions: 'users/sessions'
      }

特に問題なさそう

registrations_controller.rbに下記を記載

registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
  before_action :authenticate_user!

  protected

  *この部分を記載
  def update_resource(resource, params)
    resource.update_without_current_password(params)
  end

  (省略)

end

受けとったリソースを、update_without_current_passwordメソッド(Userモデルに後で実装します)で
パスワード抜きで更新できるようにし、引数にparamsを指定してリソースの中身を更新しています。

User モデルに update_without_current_password を実装

一個前でregistration_controllerに自力で定義したメソッドを使えるようにモデルに定義していく

models/user.rb
def update_without_current_password(params, *options)
    params.delete(:current_password)   *params.delete(:current_password) で 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

あとはビューのフォームを消すだけ

パスワードのフォームを削除して終了

参考にしたサイト
Devise でユーザーがパスワードなしでアカウント情報を変更するのを許可
Deviseでパスワードの入力無しでユーザー情報の更新をする方法