setoya-blog

システム開発技術、データ分析関連でお勉強したことや、山奥生活を綴る、テンション低めなブログです。

ActiveAdminにCanCanを使った権限機能を追加する(2)

今日は、権限を定義するところ。あとでカスタマイズする前提で、まずはcancanの権限設定用クラスであるAbilityクラスを作ることにする。

作業の流れ

  1. cancanのAbilityクラスを生成する
  2. cancanのAbilityクラスに権限の設定をする
  3. AdminUserクラスに権限の保有をチェックするメソッドを追加する

1. cancanのAbilityクラスを生成する

まずはcancanのジェネレータを使って、テンプレートを生成する

> rails g cancan:ability

2. cancanのAbilityクラスに権限の設定をする

こんな感じでロールの継承を定義する。admin_rolesはadmin_roles_assignテーブルにデータが入っていないと空になります。

ActiveAdminにゲストはいらないと思うが念のため。

ロールの継承の定義は、それぞれのメソッドで定義します。
AdminUser#admin_rolesというメソッドがある前提ですが、これは、ActiveAdminにCanCanを使った権限機能を追加する(1) - sessanの日記で設定済です。

managerロールは、Hogeクラスだけをmanageでき、adminロールは、managerクラスの権限プラスMogeクラスをmanageできるという設定例です。
admin_rolesテーブルに、manager、adminというnameのロールが定義されている前提です。

class Ability
  include CanCan::Ability

  def initialize(admin_user)
    admin_user || AdminUser.new # for guest
    admin_user.admin_roles.each { |role| send(role.name.downcase) }

    if admin_user.admin_roles.size == 0
      can :read, :all #for guest without roles
    end
  end

  def manager
    can :manage, Hoge
  end

  def admin
    manager
    can :manage, Moge
  end

end

3. AdminUserクラスに権限の保有をチェックするメソッドを追加する

  #in models/admin_user.rb
  def has_role?(admin_role_sym)
    admin_roles.any? { |r| r.name.underscore.downcase.to_sym == admin_role_sym }
  end