2009-09-21 3 views
54

requirerequire_dependencyはどのように異なっていますか?
require_dependencyは自動的にクラスを開発中にリロードすることができますが、requireはできません。Railsでrequire、require_dependency、および定数のリロードがどのように関連していますか?

私はRails 'ActiveSupport::Dependenciesとdispatcher.rbコードを掘りました。私がrequire_dependencyのコードで見たのは、基本的にautoloaded_constants配列に定数を追加しているということです。しかし、各リクエスト後にディスパッチャ内でclear_applicationにクリアされます。

誰かが明確な説明をしたり、役立つリソースを教えてもらえますか?

+0

FYI:クラスリロードは、通常のアプリケーションと同じように、エンジン(アプリケーション/フォルダを持つプラグイン以外のもの)で自動的に処理されます。 –

+0

ありがとう、ええ、私はそれを認識しています。しかし、これは私の他の質問につながります:私はプラグインの中で他のプラグインを使うことはできますか?私のプラグインでact_as_xxxプラグインを使いたいのですが、プラグインのvendor/pluginsディレクトリにact_as_xxxを入れてから、$ LOAD_PATHにパスを追加できますか?私は別のスレッドthoでこれを尋ねる必要がありますね、私の元の質問とは無関係です。 – wei

答えて

108

require(およびそのいとこload)は、Rubyのコアメソッドです。 require_dependencyは、Railsが依存関係管理の問題を処理するのに役立つ方法です。簡単に言えば、Railsは開発モードでクラスをリロードし、コードを変更するたびにサーバを再起動する必要はありません。 Railsフレームワークはrequire_dependencyあなたのコードを変更したときにそれを追跡してリロードできるようにします。標準のRuby requireはそうしていません。アプリ(またはプラグイン/エンジン)の開発者は、require_dependencyを気にする必要はありません。これは、Railsの内部的なものです。

Railsクラスの読み込みプロセスの魔法は、ActiveSupport :: Dependenciesモジュールにあります。このコードはデフォルトのRubyの動作を拡張し、Railsのパスとファイルの命名規則を使用して、Railsアプリケーション内のコードがモジュールから継承するクラス(モジュールを継承するクラスを含む)を自動的に読み込むようにします。これにより、普通のRubyアプリケーションと同じように、プログラマがrequireコールでコードを捨てる必要がなくなります。

は、別の言い方をすると、これは、ファイルapp/models/admin/user.rbclass Admin::Userを定義し、Railsは、あなたがコントローラのようなアプリケーションの別の部分からAdmin::User.newを呼び出したときに話しているのかを知る必要があります。 ActiveSupport :: Dependenciesがなければ、手動でrequire必要なものをすべて手に入れる必要があります。

C#、Javaなどの静的型付けされた言語を使用している場合、これは驚くかもしれません.Railsコードは必要になるまでロードされません。たとえば、モデルクラスUserは定義されておらず、User.whatever_method_hereを呼び出すまではuser.rbがロードされません。 Railsは、Rubyがその不足している定数について不平を言うのを防ぎ、Userのコードをロードして、Rubyを通常通り続けることができます。

具体的な必要性については話すことはできませんが、プラグインまたはエンジンの中から実際にrequire_dependencyメソッドを使用する必要がある場合は非常に驚いています。 Railsの規則に従えば、$ LOAD_PATHを手で調整する必要はありません。これは "Railsの方法"ではありません。

Rubyの世界では、Railsのシンプルさと明快さが重要です。プラグインやエンジンを作成して、内部で深く掘り下げていたら、別の角度からあなたの問題に近づくことを検討するかもしれません。私の腸は、あなたが不必要に複雑な何かをしようとしているかもしれないと私に伝えます。しかし、もう一度、私はあなたが正確にやっていることを知りません! :)

16

require_dependencyは、エンジンで定義されていないクラス(別のエンジンやRailsアプリなど)を再オープンしてリロードする場合に便利です。この場合の動作は次のとおりです。

関連する問題