Hook Rails引擎进入全局布局

时间:2011-09-26 12:59:56

标签: ruby-on-rails hook rails-engines

我目前正在编写模块化rails应用程序,其中每个功能都在rails引擎中。我已经设置了我的第一台发动机,到目前为止一切正常。现在我想知道将引擎挂钩到我当前在app/views/layouts/application.html.haml中呈现的全局导航的最佳方法是什么,如下所示:

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

我发现的最接近的是spreeHookListener,它使用了deface gem。不幸的是,deface只适用于html / erb输出,因为它用nokogiri解析DOM,这不是最好的想法。

2 个答案:

答案 0 :(得分:1)

为了记录,我已经解决了这个问题:

  • 将基础应用程序移动到引擎/宝石以使其变得容易需要
  • 添加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

答案 1 :(得分:0)

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

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

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