1

そのため、ユーザー(Devise)が、ブランチ、地域、または全国レベルのいずれであるかに応じて、メインモデル(この場合は学校)のすべてまたはサブセットを表示できるアプリがあります。

Branch belongs_to Region
School belongs_to Branch

私がやりたいのは、ActiveAdminに対して透過的になるように、(おそらくスコープを使用して)アクセス許可を接続できるようにすることです。ユーザーがActiveAdminにログインすると、表示が許可されている学校のみのリストが表示されます。

したがって、これはActiveAdminソリューションか、より低いレベルのソリューションのいずれかである可能性があります。

どんなアイデアでも大歓迎です:)

4

1 に答える 1

6

ユーザーが学校、支部、または地域のいずれかにポリモーフィックな関連付けを持つように設定できます。この関連付けがnilの場合、ユーザーはすべてにアクセスできることを意味します(あなたが言及した全国レベル)。

class User < ActiveRecord::Base
  belongs_to :administrates, :polymorphic => true
end

class School < ActiveRecord::Base
  belongs_to :branch
  has_many :users, :as => :administrates
end

class Branch < ActiveRecord::Base
  belongs_to :region
  has_many :schools
  has_many :users, :as => :administrates
end

class Region < ActiveRecord::Base
  has_many :branches
  has_many :users, :as => :administrates
end

Active Adminに特定のスコープを使用するように指示する必要があるため、ActiveAdminに対して完全に透過的にすることはできません。scope_toこのために、あなたはあなたのActiveAdmin.registerブロックの中でうまくいくことができるはずです。scope_to多形の関連付けを機能させるには、少し魔法をかける必要がありますが、それは実行可能です。

ActiveAdmin.register School do
  scope_to do
    Class.new do
      def self.schools
        case current_user.administrates
        when School
          School.where(:id => current_user.administrates_id)
        when Branch
          School.where(:branch_id => current_user.administrates_id)
        when Region
          School.where(:branch_id => current_user.administrates.branches.map(&:id))
        when NilClass
          School.scoped
        end
      end
    end
  end
end

これは基本的に、Active Adminが学校(またはインデックスページの学校のリスト)をロードするたびに、scope_toブロック内に作成した匿名クラスを介してスコープを設定することを意味します。

要件に応じて、Branchおよびモデルに同様の何かを実装できるはずです。Region

ただし、現在のユーザーの範囲外のリソースを表示するフィルターとフォームに関して使用する場合、現在未解決の問題があることに注意してください。scope_to

また、特定のレベル以下のユーザーのみを表示するように特定のレベルのユーザーを制限する権限も必要です(たとえば、ブランチレベルのユーザーはリージョンにアクセスできないようにする必要があります)。このためには、CanCanを使用する必要があります。

CanCanをActiveAdminに統合する方法については、こちらまたはこちらをご覧ください。

于 2011-10-11T21:00:08.537 に答える