2011-09-26 95 views
3

我目前正在编写一个模块化Rails应用程序,其中每个功能都在Rails引擎中。我已经建立了我的第一台引擎,一切工作都很好。现在我想知道什么是挂钩发动机进入我的全球导航当前在app/views/layouts/application.html.haml呈现的最佳方式,是这样的:Hook Rails引擎进入全局布局

%nav#main-nav 
    %ul 
    %li 
     = link_to "Users", users_path, :class => "no-submenu settings" 
     %ul 
     %li ... 

我发现的最接近的事情是的spreeHookListener,它使用抹掉宝石。不幸的是,deface只能用于html/erb输出,因为它使用nokogiri解析DOM,但这不是最好的主意。

+0

你可以发布一个有点您HAML文件来显示它应该如何适应? –

+0

当前导航是一个列表。它计划最多支持子级别,这也是一个列表,如下所示: %nav#main-nav %ul %li = link_to“Users”,users_path,:class =>“no-子菜单设置“ – unhollow

+0

提示:您可以编辑您的问题以放置代码。 –

回答

1

备案,我已经解决了这个问题是这样的:

  • 将基本应用到发动机/宝石以及使其容易require'able
  • 添加Navigation
  • 注册到这个类从MyEngine

core/lib/navigation.rb

class Navigation 

    @registered_blocks = {} 

    class << self 
    def register(name, &block) 
     @registered_blocks[name] ||= block 
    end 

    def bind(root) 
     @registered_blocks.each do |name, block| 
     block.call(root) 
     end 
    end 
    end 
end 

myext/lib/myext/engine.rb

Navigation.register :myext do |root| 
    root.item :mylink, "My Link", "/" 
end 

config/navigation.rb(用于simple-navigation):

navigation.items do |root| 
    Navigation.bind(root) 
end 
0

在您的应用中创建一个模块,您将在每个引擎中包含该模块。 MyAppModule

class CmsModule::Railtie < ... 
    include MyAppModule 
end 

然后使用included钩与你的应用程序注册您的导航等。您可以将所有钩子等封装在MyAppModule之内,为您的所有引擎提供一致的集成。

+0

你能举个self.included的例子吗?理想情况下,引擎应该能够在类级 – unhollow

+0

上调用'add_navigation'标题',url,{sub-list here}'或者这样:因为'config/application.rb'中的'Bundle.require'需要这个模块,哪里是放置这个最好的地方?我已经通过将模块放在'config/application.rb'中来测试它,但迟早会变得麻烦 – unhollow