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