ActiveAdmin - 自定义显示的记录

Jer*_*ome 1 activerecord ruby-on-rails ruby-on-rails-3.1 activeadmin

所以我有一个应用程序,其中用户(Devise)能够查看全部或主要模型的子集(在本例中为Schools),具体取决于用户是在分支机构,地区还是国家级别.

Branch belongs_to Region
School belongs_to Branch
Run Code Online (Sandbox Code Playgroud)

我想要做的是能够以对ActiveAdmin透明的方式连接权限(可能与范围).用户登录ActiveAdmin并显示仅允许他们查看的学校的列表.

所以我想这可能是ActiveAdmin解决方案,也可能是较低级别的解决方案.

任何想法都会非常欢迎:)

Tho*_*son 6

您可以对其进行设置,以便用户学校,分支机构或地区建立多态关联.如果此关联为零,则意味着用户可以访问所有内容(您提到的国家级别).

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
Run Code Online (Sandbox Code Playgroud)

您不能让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
Run Code Online (Sandbox Code Playgroud)

这基本上意味着每次Active Admin将加载学校(或索引页面上的学校列表)时,它将通过我们在scope_to块内创建的匿名类来限定它.

您应该能够根据您的要求在BranchRegion模型上实现类似的功能.

您应该知道,当使用过滤器和表单显示当前用户范围之外的资源时,当前存在一个未解决的问题scope_to.

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

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