所以我有一个应用程序,用户(Devise)有能力查看全部或主要模型的子集(在本例中为Schools),具体取决于用户是在分支机构,地区还是国家层面。
Branch belongs_to Region
School belongs_to Branch
我想要做的是能够以对ActiveAdmin透明的方式连接权限(可能与范围)。用户登录ActiveAdmin并显示他们允许查看的学校列表。
所以我猜这可能是ActiveAdmin解决方案,也可能是较低级别的解决方案。
非常欢迎任何想法:)
答案 0 :(得分:6)
您可以进行设置,以便用户对学校,分支机构或地区有polymorphic association。如果此关联为零,则意味着用户可以访问所有内容(您提到的国家级别)。
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完全透明,因为您必须告诉Active Admin使用特定范围。为此,您应该可以在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
关于过滤器和表单显示当前用户范围之外的资源时,当前存在an open issue。
您还需要授权才能限制某个级别的用户只能看到该级别及以下级别(例如,分支级别的用户不应该访问区域)。为此,您应该使用CanCan。