module ActiveSupport::LazyLoadHooks
Хуки отложенной загрузки
LazyLoadHooks позволяет Rails отложенно загружать множество компонентов и тем самым ускорять запуск приложения. Благодаря этой возможности теперь нет необходимости при запуске подключать ActiveRecord::Base только для применения конфигурации. Вместо этого регистрируется хук, который применяет конфигурацию после загрузки ActiveRecord::Base. В этом примере используется ActiveRecord::Base, но эту возможность можно применять и в других местах.
Ниже показан пример вызова метода on_load для регистрации хука.
initializer 'active_record.initialize_timezone' do
ActiveSupport.on_load(:active_record) do
self.time_zone_aware_attributes = true
self.default_timezone = :utc
end
end
После выполнения всего кода ActiveRecord::Base вызывается run_load_hooks. Последняя строка ActiveRecord::Base выглядит так:
ActiveSupport.run_load_hooks(:active_record, ActiveRecord::Base)
Затем run_load_hooks выполнит все хуки, зарегистрированные методом on_load. В приведенном выше примере будет выполнен блок кода из initializer.
Если зарегистрировать хук, который уже был запущен, он выполнится немедленно. Это позволяет вкладывать хуки для кода, зависящего от нескольких отложенно загружаемых компонентов:
initializer "action_text.renderer" do
ActiveSupport.on_load(:action_controller_base) do
ActiveSupport.on_load(:action_text_content) do
self.default_renderer = Class.new(ActionController::Base).renderer
end
end
end
Общедоступные методы экземпляра
# File activesupport/lib/active_support/lazy_load_hooks.rb, line 60
def on_load(name, options = {}, &block)
@loaded[name].each do |base|
execute_hook(name, base, options, block)
end
@load_hooks[name] << [block, options]
end Объявляет блок, который будет выполнен после полной загрузки компонента Rails. Если компонент уже загружен, блок выполняется немедленно.
Параметры
-
:yield— передает объект, которыйrun_load_hooksвblock. -
:run_once— заданныйblockбудет выполнен только один раз.
# File activesupport/lib/active_support/lazy_load_hooks.rb, line 75
def run_load_hooks(name, base = Object)
@loaded[name] << base
@load_hooks[name].each do |hook, options|
execute_hook(name, base, options, hook)
end
end Выполняет все блоки, зарегистрированные для name с помощью on_load, используя base в качестве контекста выполнения.
ActiveSupport.run_load_hooks(:active_record, ActiveRecord::Base)
В приведенном выше примере будут выполнены все хуки, зарегистрированные для :active_record внутри класса ActiveRecord::Base.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.