主なアプリケーションは、基本的に複数のエンジンのコンテナーです。メイン エンジンの 1 つは、他のさまざまなエンジンからの統計やレポートなどを提供する「ダッシュボード」アプリケーションです。ダッシュボードで他のエンジンからパーシャルをレンダリングすると、元のエンジンのルートにアクセスできません。
例としてテスト エンジンを使用し、それとダッシュボード エンジンをメイン アプリの route.rb ファイルに次のようにマウントします。
mount Test::Engine, :at => "/test", :as => "test"
mount Dashboard::Engine, :at => "/dashboard", :as => "dashboard"
私のテスト エンジンには、ダッシュボードで使用したいパーシャルのウィジェットがあります。ダッシュボードのビューには次のものがあります。
<%= render :partial => "test/dashboard/test" %>
ウィジェットの部分的なコードは正常に表示され、非常に基本的です。
<h3>Test</h3>
ただし、次のような Test のルートの 1 つにアクセスしようとするものを追加すると:
<%= link_to "Root", test.root_path %>
test が nil であることを示す次のエラーが表示されます。
nil:NilClass の未定義のメソッド 'root_path'
link_to をウィジェットからダッシュボードのビューに移動すると、正常に動作します。ウィジェットの link_to から「test」を削除して、エンジンで通常の名前付きルートとして扱うと、ダッシュボード エンジンのルート パスにリンクされます。テストエンジンではありません。
これを防ぎ、ダッシュボード ビューでレンダリングされているウィジェットでテスト エンジンのルートにアクセスする方法についてのアイデアはありますか? 各エンジンのウィジェットをモジュール化してエンジン内に収めるようにしたいと考えています。そうすれば、メイン アプリケーションがエンジンを使用しないことにした場合でも、ダッシュボードは不要なコードが多すぎることを心配する必要がありません。