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: アクセス権限がありません
たぶん、これでいい。
