deviseはデフォルトでuserの更新(Devise::RegistrationsController#update)に現在のパスワード(current_password)が要る。
ソースを見てみるとmodelにupdate_without_passwordというのがあるのでこれかと思いきや、これはpasswordとpassword_confirmation無しでupdateするものだった。
自分でupdate_without_current_passwordを作る。
# app/models/user.rb:
class User < ActiveRecord::Base
def update_without_current_password(params, *options)
params.delete(:current_password)
if params[:password].blank?
params.delete(:password)
params.delete(:password_confirmation) if params[:password_confirmation].blank?
end
clean_up_passwords
update_attributes(params, *options)
end
end
controllerからもこれを使うようにする。
# app/controllers/registrations_controller.rb:
class RegistrationsController < Devise::RegistrationsController
def update
@user = User.find(current_user.id)
if @user.update_without_current_password(params[:user])
sign_in @user, bypass: true
set_flash_message :notice, :updated
redirect_to after_update_path_for(@user)
else
render 'edit'
end
end
end
面倒ですね。