単純に自分のコードの書き方が悪かっただけなのですが…。
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)で持続させてからリダイレクトさせます。それ以外の場合もありますが、今回は省略してエラーメッセージを消してトップページにリダイレクトしています。
ずっと気になっていたけれど優先順位を下げていた問題が解決したので、ほっと一安心。