4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Sorceryで複数モデルを扱う

Last updated at Posted at 2020-11-26

2021/9/3 追記

複数モデルでloginメソッドを利用する時のことを書いていなかったので追記

Sorcery

How

例: AdminモデルとUserモデルが存在して、両方でSorceryを使いたい場合
前提として、AdminかUserのどちらかでSorceryの導入が完了している

users_controller
def current_user
  User.find_by(id: session[:user_id])
end
config/initializer/sorcery.rb
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を使うやり方もあるらしいがこっちがシンプル

4
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?