Ответ 1
Автор связанной статьи здесь. Здесь попытка прояснить путаницу, исходя из ответа @fkreusch.
В Ruby вам потребуется каждый .rb
файл, чтобы запустить его код. Однако обратите внимание, что в Rails вы никогда не нуждаетесь ни в каких своих моделях, контроллерах или других файлах в директории app/
. Почему это? Это потому, что в Rails app/*
находится в autoload_paths
. Это означает, что когда вы запускаете приложение rails в разработке (например, через rails console
), пока еще не требуется ни одна из моделей и контроллеров. Rails использует специальную магическую особенность ruby, чтобы на самом деле ждать, пока код не укажет константу, скажем Book
, и только тогда она запустит require 'book'
, которую она найдет в одном из autoload_paths
. Это дает вам более быстрый запуск консоли и сервера в процессе разработки, потому что при запуске ничего не требуется, только когда код действительно нуждается.
Теперь это хорошо для локального развития, но как насчет производства? Представьте себе, что в вашем производстве ваш сервер выполняет тот же тип магической постоянной загрузки (автозагрузка). Это не конец света на самом деле, вы запускаете свой сервер на производстве, и люди начинают просматривать ваши страницы немного медленнее, потому что некоторые из файлов должны быть загружены автоматически. Да, это медленнее для тех нескольких первоначальных запросов, в то время как сервер "разогревается", но это не так уж плохо. Кроме того, это не конец истории.
Если вы работаете с ruby 1.9.x(если я правильно помню), тогда автоматически требующие такие файлы не являются потокобезопасными. Поэтому, если вы используете сервер, такой как puma, у вас возникнут проблемы. Даже если вы не используете многопоточный сервер, вам все равно, вероятно, лучше, если ваше приложение будет "проактивно" при запуске. Это означает, что в процессе производства вы хотите, чтобы каждая модель, каждый контроллер и т.д. Были полностью необходимы при запуске приложения, и вы не возражаете против более длительного времени запуска. Это называется нетерпеливой нагрузкой. Все рубиновые файлы с нетерпением загружаются, понимаете? Но как вы можете это сделать, если ваше приложение rails не имеет одного оператора require
? Что там, где eager_load_paths
входит. Независимо от того, что вы вкладываете в них, все файлы во всех каталогах под этими путями потребуются при запуске в процессе производства. Надеюсь, это очистит его.
Важно отметить, что eager_load_paths
не активны в среде разработки, поэтому все, что вы вкладываете в них, не будет сразу требоваться немедленно в разработке, только в процессе производства.
Также важно отметить, что просто положить что-то в autoload_paths
не сделает его загруженным в производство. К сожалению. Вы должны явно вставить его в eager_load_paths
.
Еще одна интересная особенность заключается в том, что в каждом приложении rails все каталоги под app/
автоматически отображаются как в autoload_paths
, так и в eager_load_paths
, что означает, что добавление каталога там не требует дальнейших действий.