Spec-Zone.ru › Ruby on Rails 8.1

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

Общедоступные методы экземпляра

on_load (name, options = {}, &block) Показать исходный код
# 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 будет выполнен только один раз.

run_load_hooks (name, base = Object) Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API