CanCan使用時にDeviseでタイムアウトしたときのflashを活かす

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

ずっと気になっていたけれど優先順位を下げていた問題が解決したので、ほっと一安心。


カテゴリー Ruby, Ruby on Rails | タグ   | パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です