devise で現在のパスワードを入力せずにアカウント情報を変更できるようにする

「Devise でユーザーがパスワードなしでアカウント情報を変更するのを許可」 でも変更方法がのっていたけれど、そちらでは Devise::RegistrationsController#update を オーバーライドして、update_resource部分を変更していた。

だけど、update_resourceは、もともと

def update_resource(resource, params)
  resource.update_with_password(params)
end

のようになっているので

def update_resource
  resource.update_without_current_password(params)
end

としたほうが、コードも短くて好みだった。

結局のところ、devise で現在のパスワードを入力せずにアカウント情報を変更できるようにするために以下の箇所を変更した。

# config/routes.rb
- devise_for :users
+ devise_for :users, controllers: { registrations: 'registrations' }


# app/controllers/registrations_controller.rb
# update_resourceが使われているのは、devise v3.1から
+ class RegistrationsController < Devise::RegistrationsController
+   protected
+   def update_resource(resource, params)
+     resource.update_without_current_password(params)
+   end
+ end


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