2013-02-22 88 views
1

使用名稱間距嵌套資源是否是一個可怕的想法?命名空間控制器和嵌套資源

我想要一個管理員區域,裏面有一堆控制器。被嵌套在該領域的一些資源纔有意義,例如:

resources :suppliers do 
    resources :products 
    resources :locations 
end 

雖然命名空間是這樣的:

map.namespace :admin do |admin| 
    resources :suppliers do 
    resources :products 
    resources :locations 
    end 
end 

是否有可能/一個好主意,這樣的命名空間內使用拼圖?我應該如何構造東西?

回答

1

命名空間管理區域是一個好主意,因爲它使這些控制器與公用/面向用戶的控制器分開。這裏的大贏家是安全性,因爲您的管理員操作可能會做得更多,並且可能會繞過某些安全限制,例如刪除或限制授權數量,具體取決於您希望如何構建管理訪問權限。

至於嵌套資源,如果有意義的話可以使用它。如果您永遠不想訪問其父資源上下文之外的其中一個嵌套資源,那麼使用嵌套資源是一個不錯的選擇。例如,如果您的管理界面被供應商訪問,並且每個管理員僅限於他們的資源範圍,那麼它可能使授權更簡單地嵌套資源,因爲您可以簡單地通過嵌套資源進行查詢並且您的授權被簡化爲檢查其帳戶是否與該供應商綁定。

class Admin::ProductsController < AdminController 
    before_filter :load_supplier 

    # your actions 

    def load_supplier 
    # Will trigger a 404 if the supplier does not belong to the admin 
    @supplier = current_admin.suppliers.find(params[:supplier_id]) 
    end 
end 

當然這真的取決於你的努力來完成的,什麼是管理方面的預期觀衆,他們將有充分機會獲得一切。如果是的話,他們需要訪問任何關係環境以外的資源。例如如果我是管理員,我需要做的所有產品的一些搜索/排序/篩選,不管是供應商(或者由一個或多個供應商的篩選),然後從這些約束生成CSV/Excel中。在這種情況下,使用嵌套資源可能會導致這種困難或不可能。

我個人發現嵌套的資源使用戶/面向公衆的控制器更有意義,並在管理方面更惱人的,但後來我總是建立了只限於少數人管理界面。在這種情況下,我通常轉而求助於ActiveAdmin寶石,基本上讓你在用大量的自定義選項每個模型一個完整的CRUD。