Cancanで、アクセス制限をやろうと思っているんだけれども、アクセスリストが基本的にDenyなんだが、エラーメッセージ変えたいなーと思ってた。
今までコードでは以下のような感じになっていた。
models/ablity.rb
# coding: utf-8 include CanCan::Ability def initialize(user) unless user.nil? case user.role.code when "admin" can :manage, :all else authorize! :manage, :all, message: I18n.t("cancan.access_deny") end else authorize! :manage, :all, message: I18n.t("cancan.access_deny") end end end
これを、user.role.codeがnormalの場合は、とあるデータのアップデートが可能で、後はアクセスできないようにしたかったので、以下のようにしてみた。(長いので抜粋します)
case user.role.code when "admin" can :manage, :all else can :manage, Hoge authorize! :manage, :all, message: I18n.t("cancan.access_deny") end
これでいけるだろうと思っていたらダメだった。authorize!で上書きされてしまうみたいで、アクセスできなくなった。そこで、authorize!の行を削除したら、アクセスできるようになったんだけど、許可したくないコントローラーにアクセスしたらアクセス拒否メッセージが英語になってしまった…。
ぐぐったところ、アクセス許可しない場合のエラーメッセージはconfig/locales/**.ymlに定義できるということだったので、ja.ymlに定義したら、アクセスエラーの場合のメッセージを変えられた。
アクション毎にメッセージ変えられるようだけど、そこまでしなくてもよかったので適当にやった。
ちなみに参考にしたURLは本家の説明ページ。
で、こうなった。
models/ability.rb
# coding: utf-8 include CanCan::Ability def initialize(user) unless user.nil? case user.role.code when "admin" can :manage, :all else can :update, Hoge end else cannot :manage, :all end end end
config/locales/ja.yml
ja: unauthorized: manage: all: アクセス権限がありません
たぶん、これでいい。