Cancanでアクセス権限がないときのメッセージを定義

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: アクセス権限がありません

たぶん、これでいい。


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

コメントを残す

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