2013-04-13 72 views
0

我構建了一個CMS作爲寶石的子集,它們都是從Base Gem繼承而來的。每個寶石都提供不同的功能,例如博客,頁面,事件等。我想設置我的基礎寶石,以便它可以根據安裝的寶石動態構建導航。我不想被找到的所有控制器/路由自動做到這一點,我寧願每個寶石識別導航項目哈希數組,即:Rails:從繼承的控制器方法動態構建數組

# In my Admin controller (from which all other gem controllers inherit) 
@admin_navigation = [{controller: "users", label: "Users", sort_order: 10}, {controller: "settings", label: "Settings", sort_order: 11}] 

# In my Pages gem 
@admin_navigation += [{controller: "pages", label: "Pages", sort_order: 3}, {controller: "page_templates", label: "Pagetemplates", sort_order: 8}] 

# In my blog gem 
@admin_navigation += [{controller: "posts", label: "Blog", sort_order: 4}, {controller: "tags", label: "Tags", sort_order: 5}] 

基本上我想要我的@admin_navigation變量包括每個繼承的控制器的所有導航項目。有沒有辦法讓控制器從每個繼承的控制器調用一個方法?

有沒有更好的方法來實現這個目標?最後,我只需要一組這些導航項哈希來構建我的菜單。提前致謝!

回答

1

你可以使用紅寶石inherited方法的類。所以,你的AdminController內,你會

def self.inherited(subclass) 
    @admin_navigation ||= [] 
    @admin_navigation += subclass.admin_navigation 
end 

假設@admin_navigation公開爲您的控制器繼承一個類的方法。您還必須確保首先定義AdminController,之後所有控制器都會真正加載,以便它們觸發回調。