Поскольку существует несколько серверов приложений, каждый из которых имеет собственную стратегию инициализации, я бы рекомендовал единственный способ надежно подключиться к процессу загрузки сервера: ActionController :: Dispatcher .
Диспетчер имеет несколько обратных вызовов; а именно:
prepare_dispatch
(добавлено с to_prepare
)
before_dispatch
after_dispatch
Обратные вызовы «prepare» запускаются перед каждым запросом в режиме разработки и перед первым запросом в производственном режиме. Объект конфигурации Rails позволяет вам добавлять такие обратные вызовы через собственный метод to_prepare
:
Rails::Initializer.run do |config|
config.to_prepare do
# do your special initialization stuff
end
end
К сожалению, насколько мне известно, этот обратный вызов всегда будет запускаться, поскольку инициализатор Rails вызывает Dispatcher.run_prepare_callbacks
, независимо от того, загружаемся ли мы с сервера, скриптом / консолью или даже с граблями. Вы хотите избежать этого, поэтому вы можете попробовать это в своей среде. Rb:
Rails::Initializer.run do |config|
# your normal stuff
end
if defined? ActionController::Dispatcher
ActionController::Dispatcher.to_prepare do
# your special stuff
end
end
Теперь ваш «специальный материал» будет выполняться только перед первым запросом в производственном режиме, но перед каждым запросом в разработке. Если вы загружаете дополнительные библиотеки, вы можете избежать загрузки чего-либо дважды, поместив оператор if
в load
или require
. Метод require
не будет загружать один файл дважды, но я все же рекомендую вам установить защиту вокруг него.