【Rails】devise - パスワードなしでアカウント情報編集できるようにカスタマイズ

内容

Ruby on Railsgem 'devise'について

deviseの登録・認証を使用するモデルレコードのカラムデータの更新を
パスワードなしでできるようにカスタマイズする方法

前提

前提① : Userモデルレコードにdeviseの登録・認証機能を使用

$ rails g devise User

前提② : deviseのレコード登録コントローラのルーティング

Rails.application.routes.draw do
  devise_for :users,
    controllers: { 
      registrations: 'registrations'
    }
end

デフォルトの設定

devise本家のアカウント情報編集のデフォルト設定では
リソースのカラム更新には、パスワードを必要としています。(→ 詳細

カスタマイズ方法

リソース更新時に発火する Devise::RegistrationsController#update
で使用されている
update_resourceメソッド をオーバライドします。

update_resourceメソッドをオーバーライド

class RegistrationsController < Devise::RegistrationsController
  def update_resource(resource, params)
    resource.update_without_current_password(params)
    # update_without_current_passwordメソッドは自分で新たに作成するメソッド
  end
end

update_without_current_passwordメソッドを新たに定義する

class User < ApplicationRecord
  def update_without_current_password(params, *options)

    if params[:password].blank? && params[:password_confirmation].blank?
      params.delete(:password)
      params.delete(:password_confirmation)
    end
 # if条件はpasswordとpassword_confirmationの入力フォームが
  # 空の場合のみに処理するのを明示するため

    result = update_attributes(params, *options)
    clean_up_passwords
    result
  end
end
注意点

devise本家で定義されている
update_without_passwordメソッドを使ってオーバーライドするだけでは、
自身でパスワード変更できなくなってしまう
ので、
自分でメソッドを作成する必要があります。

上記の例では
update_without_current_passwordメソッドという名前で作成しています。

devise本家のupdate_without_passwordメソッドのソースコードからも、
フォームから送られるparamsからpasswordとpassword_confirmationを削除して
リソースを更新するのがupdate_without_passwordメソッドのため、
入力フォームにパスワード・パスワード確認を入力しても
内部処理でparamsから除外されてしまうため
パスワードを更新することができません。

リソース編集画面からpassword/password_confirmation入力フォームを削除

編集画面から
・password入力フォーム
・password_confirmation入力フォーム
を削除し、
先ほど新たに作成し定義したupdate_without_current_passwordメソッドの
「password/password_confirmationが空の場合のみ処理する」という
if条件を常に成り立つようにします

参考

heartcombo/devise: Flexible authentication solution for Rails with Warden.
Devise でユーザーがパスワードなしでアカウント情報を変更するのを許可 | EasyRamble
【Rails】deviseでユーザー編集機能を現在のパスワードなしで更新してみる。|Yuya Abe|note