質問: お世話になります。 現在、Devise を利用して、ユーザー認証機能を作っていますが、手詰まりになりました。 状況説明が長文になっています。ご容赦ください。 ### 状況 まず、要件として、 * パスワード再発行(トークンメール送信→再設定) * パスワード変更(ログイン中のユーザーが行う。現在パスワードの入力チェックを含む) があります。 Devise のデフォルトの機能で、パスワード再発行は出来ました。 パスワード変更の実装のため、Devise::RegistrationControllerの機能のうち、 パスワードの認証機能のみを切り出して利用しようと考えました。 (デフォルトで、現在パスワードの入力チェックが存在するので流用したいです) なお、現在のルーティングは下記です。 ``` new_user_password GET /users/password/new devise/passwords#new edit_user_password GET /users/password/edit devise/passwords#edit user_password PATCH /users/password devise/passwords#update " PUT /users/password devise/passwords#update " POST /users/password devise/passwords#create ``` ### 問題 私は初心者なので、感覚上ですが、devise/passwords#edit を利用できるのが理想と考えました。 ここで、ネームスペースがバッティングするという問題にぶちあたりました。 前述のように、Devise のデフォルト機能を利用したルーティングが陣取っています。 password の各アクションには、Devise:PasswordController を継承したコントローラが割り振られています。 ※ 以後は "Devise::" は省略します。 ### 考えた解決策 3つほど解決策を考えましたが、どれもしっくりきません。 1. password ネームスペース配下で、別名のアクションを作る。(#manually_edit など) → PasswordController を継承したコントローラが受け取るため、RegistrationController の機能が利用できません。 2. 上記 1. のように、別名のアクションを作ったうえで、コントローラを別途作成して割り振る。 → 現実的な解決策のように思いますが、URL(Path)とコントローラの関係性が崩れて、保守性を欠くように思います。 3. PasswordController の継承クラス上で、RegistrationController と同様の機能を作る。 → どのような弊害が起きるかわからず、また コントローラの肥大化を招きそうなので、避けたいです。 ### 質問 こういう場合、やはりネームスペースのこだわりを捨てて、login_user/password#edit などを作るほうが現実的でしょうか。
回答: 自己解決いたしました。 結果的に、RegistrationControllerの機能の流用はせず、 ここを参考に valid_password? メソッドを使って実装しました。 ・ログイン済みユーザと未ログインユーザを before_action で振り分け ・ログイン済みユーザに対してのみ、「現在パスワード確認」を表示する。 ・確認には、前述 valid_password? を利用