Магия автозагрузки
Я думаю, что опция, управляющая папками, из которых выполняется автозагрузка, достаточно освещена в других ответах. Тем не менее, в случае, если у кого-то еще возникают проблемы с загруженным материалом, хотя пути автозагрузки были изменены по мере необходимости, этот ответ пытается объяснить, в чем заключается магия этой вещи автозагрузки.
Поэтому, когда дело доходит до загрузки материалов из подкаталогов, есть недочёт или соглашение, о котором вы должны знать. Иногда магия Ruby / Rails (на этот раз в основном Rails) может затруднить понимание, почему что-то происходит. Любой модуль, объявленный в путях автозагрузки, будет загружен, только если имя модуля соответствует имени родительского каталога. Так что, если вы попытаетесь вставить lib/my_stuff/bar.rb
что-то вроде:
module Foo
class Bar
end
end
Он не будет загружен автоматически. Потом еще раз , если вы переименовать родительские директории для foo
таким образом , хостинга для вашего модуля в пути: lib/foo/bar.rb
. Это будет там для вас. Другой вариант - назвать файл, который вы хотите загрузить автоматически, по имени модуля. Очевидно, что тогда может быть только один файл с таким именем. В случае, если вам нужно разделить ваши вещи на множество файлов, вы, конечно, можете использовать этот файл, чтобы требовать другие файлы, но я не рекомендую этого, потому что тогда, когда вы находитесь в режиме разработки, и вы изменяете эти другие файлы, Rails не может автоматически перезагрузите их для вас. Но если вы действительно хотите, вы можете иметь один файл с именем модуля, который затем указывает фактические файлы, необходимые для использования модуля. Таким образом , вы можете иметь два файла: lib/my_stuff/bar.rb
иlib/my_stuff/foo.rb
первый из них будет таким же, как указано выше, а второй будет содержать одну строку:require "bar"
и это будет работать точно так же.
PS Я чувствую себя обязанным добавить еще одну важную вещь. В последнее время, когда я хочу, чтобы в каталоге lib было что-то, что нужно было загрузить автоматически, я начинаю думать, что если это то, что я на самом деле разрабатываю специально для этого проекта (что обычно бывает, это может когда-нибудь случиться) превратиться в «статический» фрагмент кода, используемого во многих проектах или в подмодуле git и т. д., в этом случае он обязательно должен быть в папке lib), тогда, возможно, его место вообще не будет в папке lib. Возможно, это должно быть в подпапке в папке приложения. У меня такое ощущение, что это новый способ работы. Очевидно, одна и та же магия работает в тех местах, где вы кладете свои вещи на пути автозагрузки, так что это хорошо для этих вещей. Во всяком случае, это только мои мысли на эту тему. Вы можете не согласиться. :)
ОБНОВЛЕНИЕ: О типе магии ..
Как отметил Северин в своем комментарии, ядро «автозагрузки модульного механизма», безусловно, является частью Ruby, а пути автозагрузки - нет. Вам не нужны Rails, чтобы сделатьautoload :Foo, File.join(Rails.root, "lib", "my_stuff", "bar")
, И когда вы попытаетесь сослаться на модуль Foo в первый раз, он будет загружен для вас. Однако, что делает Rails, так это то, что он дает нам возможность автоматически пытаться загружать вещи из зарегистрированных папок, и это было реализовано таким образом, что нужно что-то предполагать в соглашениях об именах. Если бы он не был реализован подобным образом, то каждый раз, когда вы ссылаетесь на что-то, что в данный момент не загружено, ему придется просматривать все файлы во всех папках автозагрузки и проверять, содержит ли какой-либо из них то, на что вы пытались сослаться. Это в свою очередь победило бы идею автозагрузки и автозагрузки. Тем не менее, с этими соглашениями он может вычесть из модуля / класса ваши попытки загрузить, где это может быть определено, и просто загрузить это.
app/lib
.