3

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

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

我发现最接近的是HookListenerof spree,它使用 deface gem。不幸的是,deface 仅适用于 html/erb 输出,因为它使用 nokogiri 解析 DOM,这无论如何都不是最好的主意。

4

2 回答 2

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
于 2011-09-26T21:08:56.150 回答
0

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

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

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

于 2011-09-26T13:17:55.773 回答