deviseでアカウント削除時にパスワードを要求したい

ひさびさに自分用プログラミングメモをば。Railsアプリケーションを開発する際に認証機構としてdeviseをよくつかいますが、アカウントの削除時にパスワードを要求したくなったのでした。アカウント削除はインパクトが大きいので、再度ユーザーに確認を取りたかったり...という気持ちです。 DELETE メソッドを送るときにパスワードを一緒に送り、ログインユーザーと一致した場合にのみ削除します。

How to: Soft delete a user when user deletes account · plataformatec/devise Wiki · GitHub この記事を見る感じ、RegistrationsControllerを継承したコントローラでdestroyアクションをオーバーライドすればよさそう。 ルーティングで継承した先のコントローラをつかうようにします(参照)。

# config/routes.rb

devise_for :accounts, controllers: { registrations: "registrations"} 

パスワードを確認し、一致した場合に削除する処理は destroy_with_password が使えそうなので、これを利用します。

# app/controllers/registrations_controller.rb

class RegistrationsController < Devise::RegistrationsController

  def destroy
    result = resource.destroy_with_password(destroy_params[:current_password])
    if result
      Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name)
      set_flash_message :notice, :destroyed
      yield resource if block_given?
      respond_with_navigational(resource){ redirect_to after_sign_out_path_for(resource_name) }
    else
      # パスワード認証に失敗したときの処理を書く
    end
  end

  def destroy_params
    params.require(:account).permit(:current_password)
  end
end

これでよさそう。ではでは~。