Devise関連のControllerの親クラス

BigQueryを使う仕事が、ちょっと暇になってしまったので、またRails周りの記事を少し。

Devise関連のControllerの親クラス

Ruby on Railsを使っている人達では有名なDeviseですが、その中で使われているControllerが何を継承しているのか追ってみます。(2017年7月19日 v4.3.0時点)

Devise::SessionsController

まずは、Deviseを使う時に必ず見かけると言っても過言ではないDevise::SessionControllerを見ましょうかか。
このクラスの定義はapp/controllers/devise/sessions_controller.rbになります。

先頭の数行を抜粋してみてみると、



DeviseControllerを継承していますね。
それでは、次にDeviseControlelrの定義を見ましょうか。

DeviseController

このクラスの定義はapp/controllers/devise_controller.rbです。

こちらも抜粋。



どうやら、DeviseControllerの親クラスは、Devise.parent_controller.constantizeで評価時に動的に決まっているようです。
それじゃ、このparent_controllerの中身は一体何なのでしょうか?

Devise

Deviseは、lib/devise.rbで定義されています。
こちらで、parent_controllerを探してみましょう。

では、抜粋!

はい、定義が見つかりましたね。
parent_controllerの中身は、ApplicationControllerという文字列のようです。
つまり、ApplicationControllerがDeviseControllerの親クラスでした。

そのため、ApplicationControllerで定義しているメソッドなどがDevise::SessionsControllerなどでも利用可能であり、コールバックを定義しているなら実行されてしまうわけです。

DeviseControllerの親クラスを変更する

こちらは、難しいこともないです。
抜粋したコード内のコメントを見てもらうと分かるのですが、initializerで変更することが可能です。

変える時は、以下をinitializerに追記してください。

簡単ですよね。

最後に

業務のRailsアプリでは、1つのアプリ内に管理画面とフロント画面のCMSを構築することも多いです。
となると、それぞれのApplicationControllerが定義されたりすることがあります。
そういう時にDevise関連のControllerの親クラスを意識せずに使用して、意図しない動作になりうることもあります。
今回は、その一例です。
Gemを利用する場合は、しっかり使う範囲だけで良いので、挙動を把握しておくといいかもしれませんね。

管理画面とフロント側を凄く分けたい...

コメント

このブログの人気の投稿

ElasticIPを複数利用する時の注意

タスクの実行結果をwhenで指定するならcheck_modeつける

EC2にNameをつける