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 ...

私が見つけた最も近いものは、deface gem を使用するHookListenerof spreeでした。残念ながら、deface は nokogiri を使用して DOM を解析するため、html/erb 出力でのみ機能しますが、これは最善のアイデアではありません。

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 に答える