2021/9/3 追記
複数モデルでlogin
メソッドを利用する時のことを書いていなかったので追記
Sorcery
How
例: AdminモデルとUserモデルが存在して、両方でSorceryを使いたい場合
前提として、AdminかUserのどちらかでSorceryの導入が完了している
def current_user
User.find_by(id: session[:user_id])
end
config.user_class = 'Admin'
こうすると指定したcontroller内だけでcurrent_userの中身がuserになり、それ以外ではadminになる
controllerごとにdef current_user
を書くのも手間なので,個人的には階層を分けてapplication_controller
内に書いている。
上記のuserとadminを逆にしてもいいので、あまり使わない方をcontrollerに指定するとよさそう
current_userがセットされているので、before_action :require_login
も普通に動く
これだと呼ぶたびにSQLが走ってしまうので、viewなどで使う際には@current_user = current_user
として@current_user
を渡して使うこと。
login
Sorceryを導入するモデルが増えると、login
メソッドを使う際に困ると思う。
僕の場合は、Sorceryのconfig.user_class
にしたモデルではlogin
メソッドをそのまま利用し、
それ以外では以下のようにsessionに書き込んでいた。
1からインクリメントしていくレコードのidを渡すと複数モデル間で絶対被るので注意
session[:user_id] = @user.uuid
@motoyasu-yamada さんの書いてくれた記事に別の方法があるので、こちらも参照
https://qiita.com/motoyasu-yamada/items/9894195c40172bd43a0a
所感
Single Table Inheritanceを使うやり方もあるらしいがこっちがシンプル