我目前正在编写模块化rails应用程序,其中每个功能都在rails引擎中。我已经设置了我的第一台发动机,到目前为止一切正常。现在我想知道将引擎挂钩到我当前在app/views/layouts/application.html.haml
中呈现的全局导航的最佳方法是什么,如下所示:
%nav#main-nav
%ul
%li
= link_to "Users", users_path, :class => "no-submenu settings"
%ul
%li ...
我发现的最接近的是spree的HookListener
,它使用了deface gem。不幸的是,deface只适用于html / erb输出,因为它用nokogiri解析DOM,这不是最好的想法。
答案 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
中封装所有挂钩等,为您的所有引擎提供一致的集成。