2011-09-26 66 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