管理者とユーザーでのログイン機能が存在し、別モデルで管理したい場合、Devise を使うとscoped_views
をtrueにすれば簡単に実装できる。(参考:Ruby - Railsでdeviseひとつで複数モデルを管理しよう - Qiita)
しかし、デフォルトの場合 Devise のログアウトは全てのスコープでログアウトしてしまう。つまり管理者とユーザーでログインしていた場合、管理者としてログアウトすると同時にユーザーとしてもログアウトしてしまう
これを防ぎたい場合、config/initializers/devise.rb
にて config.sign_out_all_scopes = false
としてやればよい。
初期状態ではこの設定はコメントアウトされているので、コメントアウトを外しfalseに設定するだけで、スコープごとのサインアウトが実装できる。
テストコード込みのサンプルコードはこんな感じ。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Devise.setup do |config| | |
# 複数モデルを可能にする | |
config.scoped_views = true | |
# スコープごとのサインアウトを可能にする | |
# デフォルトの状態ではコメントアウトされているので、コメントアウトを外して false を設定する | |
config.sign_out_all_scopes = false | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'test_helper' | |
class Admins::SessionsControllerTest < ActionController::TestCase | |
def setup | |
@request.env['devise.mapping'] = Devise.mappings[:admin] | |
@admin = create(:admin) | |
@user = create(:user) | |
end | |
test '管理者としてサインアウトしても、ユーザーとしてはサインアウトしない' do | |
sign_in(@admin) | |
sign_in(@user) | |
delete :destroy | |
assert_not @controller.send(:all_signed_out?) | |
# assert @controller.signed_in?(@user) は動かなかった | |
end | |
end |
0 件のコメント :
コメントを投稿