Hook Rails Engine в глобальном макете - PullRequest
3 голосов
/ 26 сентября 2011

В настоящее время я пишу модульное приложение для рельсов, где все функции находятся внутри движка рельсов. Я установил свой первый двигатель, и пока все работает нормально. теперь я задаюсь вопросом, как лучше всего подключить движок к моей глобальной навигации, которая в данный момент отображается в app/views/layouts/application.html.haml, например:

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

Самой близкой вещью, которую я нашел, был HookListener из spree , который использует самоцвет deface. к сожалению, deface работает только с выводом html / erb, так как он анализирует DOM с nokogiri, что в любом случае не лучшая идея.

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

для записи, я решил это так:

  • Переместите базовое приложение на движок / самоцвет, чтобы сделать его легко требуемым
  • добавить 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 голосов
/ 26 сентября 2011

создайте модуль в своем приложении, который вы включите в каждый движок, например, MyAppModule

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

, затем используйте хук included для регистрации навигации и т. Д. В вашем приложении.вы можете инкапсулировать все ваши хуки и т. д. в MyAppModule, обеспечивая согласованную интеграцию для всех ваших движков.

...