2

Rails3 でモジュラー プロジェクトを作成していますが、この問題があります。

私はメイン プロジェクトを持っており、その一部をさまざまなカスタマイズで実装したいので、エンジンを使用しているので、次のようにしました。

- app
  - views
    - shared
      - _header.html.erb     <-- This one is called
  - ...
- config
- ...
- vendors
  - plugins
    - myplugin
      - app
        - views
          - controller1
            - action1.html.erb
          - shared
            - _header.html.erb       <--- I want to render this!

しかし、action1.html.erb から呼び出す場合

<%= render 'shared/header' %>

最初の _header.html.erb が呼び出されます。myplugin の「前」に呼び出したいと思います。myplugin のビューに対してのみ行うことはできますか?

これにより、多くの無駄な「名前空間」を防ぐことができます。

4

1 に答える 1

2

まったく同じ問題があり、次のようなものを思いつきました。

def self.prioritize_engine_view_paths!(engine)
  self.view_paths = engine.paths["app/views"].existent + MyApp::Application.paths["app/views"].existent
end

メイン アプリの ApplicationController で定義され、すべてのエンジンの ApplicationController で呼び出されます。

module MyEngine
  class ApplicationController < ::ApplicationController
    prioritize_engine_view_paths!(MyEngine::Engine)
  end
end

[編集] Rails 3.2.0 では、はるかに簡単になります。

config.railties_order = [Blog::Engine, :main_app, :all]

詳細については、 https://github.com/rails/rails/commit/40b19e063592fc30705f17aafe6a458e7b622ff2を参照してください。

于 2011-11-10T14:13:08.160 に答える