単純に自分のコードの書き方が悪かっただけなのですが…。
Deviseでタイムアウトした後にCanCanでアクセス権限チェックが働いて、アクセス権限がないというメッセージになっていました。タイムアウトならタイムアウトという通知じゃないとちょっとメッセージ的にキツいなと思っていたところでした(仕様上は問題ないんだけど)。
結局、CanCanの権限チェックでエラーになるので、そこで既にタイムアウトを検知していたらそのメッセージを使うようにすれば解決します。
まず、Deviseを使うmodel(Userとか)
class User < ActiveRecord::Base devise :timeoutable # 他のモジュールは適当に… end
次にCanCanの設定ですが、CanCanのabilityは適当に書いてください。
次は、ApplicationControllerです。
class ApplicationController < ActionController::Base
check_authorization unless: :devise_controller?
# 該当箇所だけ抜粋
rescue_from CanCan::AccessDenied do |exception|
if current_user
# 適当なpathを指定
redirect_to mypage_index_path, alert: exception.message
else
if flash[:timedout]
flash.keep(:alert)
redirect_to new_user_session_path
else
flash.discard
redirect_to root_url
end
end
endend
flash[:timedout]がtrueだと、タイムアウトしているので、メッセージをflash.keep(:alert)で持続させてからリダイレクトさせます。それ以外の場合もありますが、今回は省略してエラーメッセージを消してトップページにリダイレクトしています。
ずっと気になっていたけれど優先順位を下げていた問題が解決したので、ほっと一安心。
