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.rb
内class 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のシンプルさと明快さが重要です。プラグインやエンジンを作成して、内部で深く掘り下げていたら、別の角度からあなたの問題に近づくことを検討するかもしれません。私の腸は、あなたが不必要に複雑な何かをしようとしているかもしれないと私に伝えます。しかし、もう一度、私はあなたが正確にやっていることを知りません! :)
FYI:クラスリロードは、通常のアプリケーションと同じように、エンジン(アプリケーション/フォルダを持つプラグイン以外のもの)で自動的に処理されます。 –
ありがとう、ええ、私はそれを認識しています。しかし、これは私の他の質問につながります:私はプラグインの中で他のプラグインを使うことはできますか?私のプラグインでact_as_xxxプラグインを使いたいのですが、プラグインのvendor/pluginsディレクトリにact_as_xxxを入れてから、$ LOAD_PATHにパスを追加できますか?私は別のスレッドthoでこれを尋ねる必要がありますね、私の元の質問とは無関係です。 – wei