我正在构建一个CMS作为宝石的子集,所有这些都继承自Base gem。每个gem提供不同的功能,即博客,页面,事件等。我想设置我的Base gem,以便它可以根据已安装的gem动态构建导航。我不想通过查找所有控制器/路径自动执行此操作,我宁愿每个宝石都将导航项识别为哈希数组,即:
# 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变量包含每个继承控制器的所有导航项。控制器是否有办法从每个继承的控制器调用方法?
有没有更好的方法来实现这一目标?最后,我只需要一个这些导航项哈希的数组来构建我的菜单。提前谢谢!
答案 0 :(得分:1)
您可以将ruby inherited
方法用于类。所以在你的AdminController
中,你会
def self.inherited(subclass)
@admin_navigation ||= []
@admin_navigation += subclass.admin_navigation
end
假设@admin_navigation
作为继承控制器上的类方法公开。您还必须确保首先定义AdminController
,然后在之后真正加载所有控制器,以便它们触发回调。