74

どう違うrequirerequire_dependency開発中にクラスを自動的にリロードするに
はどうすればよいですか?require_dependencyrequire

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

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

4

2 に答える 2

134

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

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

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

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

require_dependency特定のニーズについて話すことはできませんが、プラグインまたはエンジン内からメソッドを実際に使用する必要がある場合は、非常に驚​​かれることでしょう。Rails の規則に従っていれば、$LOAD_PATH を手動で調整する必要もありません。これは「Rails のやり方」ではありません。

Ruby と Rails の世界では、シンプルさと明快さが重要です。プラグインやエンジンを書きたいだけで、すでに内部を深く掘り下げている場合は、別の角度から問題にアプローチすることを検討してください。不必要に複雑なことをしようとしているのかもしれないと、私の直感は教えてくれます。しかし、繰り返しますが、あなたが何をしているのか正確にはわかりません!! :)

于 2011-03-07T00:52:43.010 に答える