7

/app現在のところ、親アプリのディレクトリに同じクラスを追加するだけでは、エンジンのディレクトリに含まれているエンジンクラスを再度開くことはできません/app。例えば:

/my_engine/app/controllers/users_controller.rb
/my_app/app/controllers/users_controller.rb

親アプリに同じ名前のファイルがある場合、からのファイルmy_engineは読み込まれません。詳細はこちら:

http://www.cowboycoded.com/2011/02/28/why-you-cant-reopen-rails-3-engine-classes-from-the-parent-app/

親アプリと同じパスに同じファイル名/クラスをドロップし、クラスを上書きする代わりに再度開くことができる回避策を探しています。多分私は明白な何かを逃しています。class_evalを使用する別のファイル(別のファイル名)でこれを機能させることはできますが、その解決策にはあまり満足していません。このためのエレガントなソリューションに関するアイデアはありますか?

また、この制限の背後に理由があるのか​​、それともrailsがファイルをロードする方法(含まれているリンクを参照)の結果であり、意図的なものではないのか疑問に思っています。この方法でクラスを再開できるようにエンジンの負荷動作を変更することは、Railsの優れた機能であるように思われます。最初は混乱していたことはわかっていますが、他の開発者もこの問題に苦労することでしょう。

4

1 に答える 1

9

Rails 3.2.2 / Ruby 1.9では、プラグインのリロードをオンにしてrequire_dependencyから、クラスを再度開いて機能を追加する前に、を使用してエンジン内のクラスを要求します。これは、開発環境(つまり、クラスのリロード)でも機能します。

# development.rb
config.reload_plugins = true 

# app/controllers/my_engine/documents_controller.rb
require_dependency MyEngine::Engine.root.join('app', 'controllers', 'my_engine', 'documents_controller').to_s

module MyEngine
  class DocumentsController
    def show
      render :text => 'different'
    end
  end
end
于 2012-03-20T16:42:20.710 に答える