There's an echo in my head

日々のメモ。

sorceryのcurrent_userにはご注意

2つコントローラで名前空間をわけてそれぞれでcurrent_userを使っている場合には要注意。

sorceryは

  • ActionController::Baseでincludeされてる
  • ログイン中のユーザはcurrent_userヘルパメソッドで呼び出す。このメソッド名の変更はできない
    • ユーザのクラスではauthenticates_with_sorcery!を呼び出す必要がある
  • いくつかのフィルタアクションはcurrent_userの真偽によって実行するか否かを決定する

とあるプロジェクトではApplicationControllerAdmin::ApplicationControllerというActionController::Baseを継承した2つのコントローラがあって、

  • ApplicationController側はユーザに見せるページの親用
    • sorceryではないが 別の認証機構を通してログイン中のユーザ(Userクラス)をcurrent_userというメソッドを経由して取得していた。
  • Admin::ApplicationController 側は社内の管理者に見えるページの親用
    • あとからsorceryを導入して、その際管理者(Staffクラス)を取得するのにcurrent_userを使うようになった。

この状態で動かすとどうなるというかというと、

  • Admin::ApplicationController側は問題ない
  • ApplicationController側ではsorceryによるフィルタアクションがそれを前提としていないUserクラスに対して実行されてエラーになる

というわけで、ApplicationController側のcurrent_userのメソッド名を適当な別のものに変えて対応した。

基底クラスであるActionController::Baseに機能を追加されるのも気持ち悪いので、できればincludeするクラスを選択できたらいいなあと思った。

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。