【Rails】devise - パスワードなしでアカウント情報編集できるようにカスタマイズ
内容
Ruby on Railsのgem '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