ActiveAdmin -自定义显示的记录



所以我有一个应用程序,用户(设计)有能力看到所有,或主要模型的一个子集(在这种情况下学校),这取决于用户是否在分支机构,地区或国家层面。

Branch belongs_to Region
School belongs_to Branch

我想做的是能够以这样一种方式连接权限(可能有一个范围),以便对ActiveAdmin透明。用户登录到ActiveAdmin,然后显示一个只允许他们查看的学校列表。

所以我猜这可能是一个ActiveAdmin解决方案或更低层次的东西。

您可以设置它,以便用户具有与学校,分支机构或地区的多态关联。如果此关联为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完全透明,因为你必须告诉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

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

您应该能够在BranchRegion模型上实现类似的东西,这取决于您的需求。

你应该意识到,当使用scope_to时,关于过滤器和表单显示当前用户范围之外的资源,目前存在一个开放的问题。

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

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

最新更新