【Rails】devise - deviseのデフォルト設定(リソース更新時にパスワードが必要)

内容

devise本家では
deviseの登録・認証を使用するモデルレコードのカラム更新にはパスワードを必要としています。

これをdevise本家のソースコードから追ってみます。

ソースコード追跡

Devise::RegistrationsController#update

アカウント更新時に発火するアクションです。
中身を見てみましょう

class RegistrationsController < Devise::RegistrationsController
  def update
    self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
    prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?(:unconfirmed_email)

    resource_updated = update_resource(resource, account_update_params)  
    # レコード更新
  
    yield resource if block_given?
    ...
end

update_resourcesメソッドの返り値を
更新完了のリソース resources_updated へ格納しています。

次はupdate_resourcesについて見てみます。

Devise::RegistrationsController#update_resources

class RegistrationsController < Devise::RegistrationsController
 def update_resource(resource, params)
    resource.update_with_password(params)
  end
end

update_resouces(resource, params)メソッドは
・第1引数resourceupdate_with_passwordメソッドの使用対象オブジェクト
・第2引数paramsupdate_with_passwordメソッドに渡す引数
として、update_with_passwordメソッドを発火させます。

Devise::Models::DatabaseAuthenticatable#update_with_password

update_with_passwordメソッド
メソッドの名前の通り、パスワードが正しければリソースを更新するものでした。

まとめ

deviseを適用するモデルレコード更新時に走るDevise::RegistrationsController#updateアクションの根幹に
Devise::Models::DatabaseAuthenticatable#update_with_passwordメソッドがあるため、
デフォルトではリソース情報更新にパスワードが必要となっています。