Rails:从继承的控制器方法动态构建数组

时间:2013-04-13 15:46:59

标签: ruby-on-rails-3 controller

我正在构建一个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变量包含每个继承控制器的所有导航项。控制器是否有办法从每个继承的控制器调用方法?

有没有更好的方法来实现这一目标?最后,我只需要一个这些导航项哈希的数组来构建我的菜单。提前谢谢!

1 个答案:

答案 0 :(得分:1)

您可以将ruby inherited方法用于类。所以在你的AdminController中,你会

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

假设@admin_navigation作为继承控制器上的类方法公开。您还必须确保首先定义AdminController,然后在之后真正加载所有控制器,以便它们触发回调。