1

所以我有一个应用程序,其中用户(设计)有能力看到全部或主要模型的子集(在这种情况下学校),取决于用户是在分支机构,地区或国家层面。ActiveAdmin - 自定义显示的记录

Branch belongs_to Region 
School belongs_to Branch 

我想什么做的是能够以这样的方式是透明的ActiveAdmin要连接的权限(带瞄准镜也许)。用户登录到ActiveAdmin并显示仅允许他们看到的学校列表。

所以我想这可能是ActiveAdmin解决方案或更低级别的东西。

任何想法将是非常欢迎的。

+0

我对管理框架的经验是,它们不适合普通的网站用户。然而,我没有ActiveAdmin的经验,所以我不能评论它。不过看起来不错,我会试一试我的下一个项目。 –

+0

它看起来很酷,不是吗?我已经有了RailsAdmin来启动和运行,但是我将退休并从头开始管理自己的管理员 - 试图弄清楚ActiveAdmin是否足够灵活以便成为一个好的基础。 – Jerome

+0

Gotcha ;-)让我们知道你在找什么 –

回答

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使用特定范围。为此,您应该可以在ActiveAdmin.register区块内获得scope_to。你必须做一个小魔术,使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 

这基本上意味着,每一次活动管理员会加载一所学校(或学校的索引页上的列表) ,它将通过我们在scope_to块内创建的匿名类进行范围。

根据您的要求,您应该能够在BranchRegion型号上实现类似的功能。

但是,您应该知道,当使用scope_to时,当前存在an open issue,关于显示当前用户范围之外的资源的过滤器和表单。

您还需要授权才能限制某个级别的用户只能看到该级别及以下的级别(例如,分支级别的用户不应访问区域)。为此,您应该使用CanCan

有关如何在Active Admin中集成CanCan的信息,请参阅thisthis

+0

多么出色的答案,涵盖了我需要知道的一切,谢谢托马斯。希望我能够在不久的将来重新回到StackOverflow。 – Jerome