自動読み込みの魔法
自動ロードが行われるフォルダーを制御するオプションは、他の回答で十分にカバーされていると思います。ただし、必要に応じて自動ロードパスを変更したにもかかわらず、他の誰かが問題をロードしている場合、この回答は、この自動ロードの背後にある魔法が何であるかを説明しようとします。
したがって、サブディレクトリからの読み込みに関しては、知っておくべき落とし穴や規則があります。Ruby/Rails の魔法 (今回は主に Rails) によって、何かが起こっている理由を理解するのが難しくなることがあります。自動ロード パスで宣言されたモジュールは、モジュール名が親ディレクトリ名に対応する場合にのみロードされます。したがって、次のようなものに入れようとする場合lib/my_stuff/bar.rb
:
module Foo
class Bar
end
end
自動的にロードされることはありません。次に、親ディレクトリの名前を変更してfoo
、モジュールを path: にホストするとしますlib/foo/bar.rb
。それはあなたのためにそこにあります。別のオプションは、モジュール名でオートロードするファイルに名前を付けることです。明らかに、その名前のファイルは 1 つしか存在できません。自分のものを多くのファイルに分割する必要がある場合は、もちろんその 1 つのファイルを使用して他のファイルを要求することもできますが、開発モードで他のファイルを変更すると、Rails は自動的に変更できないため、お勧めしません。それらをリロードしてください。ただし、本当に必要な場合は、モジュールを使用するために必要な実際のファイルを指定するモジュール名で 1 つのファイルを作成できます。したがって、2 つのファイルを持つことができます。前者は上記lib/my_stuff/bar.rb
とlib/my_stuff/foo.rb
同じで、後者は単一行を含みます。require "bar"
それはまったく同じように機能します。
PSもう1つ重要なことを追加せざるを得ないと感じています。最近、オートロードする必要のある何かを lib ディレクトリに入れたいと思うときはいつでも、これが実際にこのプロジェクトのために特別に開発しているものである場合 (通常はそうですが、いつの日か多くのプロジェクトやgitサブモジュールなどで使用されるコードの「静的」スニペットに変わります..その場合、間違いなくlibフォルダーにあるはずです)、おそらくその場所はlibフォルダーにまったくありません. app フォルダーの下のサブフォルダーにあるはずです。これが、Rails の新しいやり方だと感じています。明らかに、同じ魔法がオートロード パス内のどこにでも機能しているため、これらの処理に適しています。とにかく、これはこの件に関する私の考えです。同意しないのは自由です。:)
UPDATE: 魔法の種類について..
セヴェリンがコメントで指摘したように、コアの「モジュールの自動ロードメカニズム」は確かにRubyの一部ですが、自動ロードパスのものはそうではありません。Railsは必要ありませんautoload :Foo, File.join(Rails.root, "lib", "my_stuff", "bar")
. モジュール Foo を初めて参照しようとすると、モジュールがロードされます。ただし、Rails が行うことは、登録されたフォルダーから自動的に何かを試してロードする方法を提供することです。これは、命名規則について何かを想定する必要があるような方法で実装されています。そのように実装されていない場合、現在ロードされていないものを参照するたびに、すべての autoload フォルダー内のすべてのファイルを調べて、参照しようとしているものが含まれているかどうかを確認する必要があります。これにより、自動ロードと自動再ロードのアイデアが無効になります。ただし、これらの規則が整っていると、モジュール/クラスから、それが定義されている可能性のある場所をロードしようとして、それをロードするだけであると推測できます。