1

主なアプリケーションは、基本的に複数のエンジンのコンテナーです。メイン エンジンの 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」を削除して、エンジンで通常の名前付きルートとして扱うと、ダッシュボード エンジンのルート パスにリンクされます。テストエンジンではありません。

これを防ぎ、ダッシュボード ビューでレンダリングされているウィジェットでテスト エンジンのルートにアクセスする方法についてのアイデアはありますか? 各エンジンのウィジェットをモジュール化してエンジン内に収めるようにしたいと考えています。そうすれば、メイン アプリケーションがエンジンを使用しないことにした場合でも、ダッシュボードは不要なコードが多すぎることを心配する必要がありません。

4

1 に答える 1

2

いろいろ調べた結果、エンジンがメイン アプリケーションにマッピングされているのと同じ名前をパーシャルに付けることはできないことがわかりました。パーシャルの名前を _test_widget.html.erb に変更すると、名前に競合がないため、NilClass エラーはなくなります。

于 2013-05-02T14:25:21.593 に答える