延迟加载钩子
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) 链接
声明一个代码块,该代码块将在 Rails 组件完全加载时执行。如果组件已经加载,则立即执行代码块。
选项
-
:yield
- 将run_load_hooks
的对象传递给block
。 -
:run_once
- 给定的block
仅运行一次。
来源:显示 | 在 GitHub 上
# 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
run_load_hooks(name, base = Object) 链接
执行所有通过 on_load
注册到 name
的代码块,使用 base
作为评估上下文。
ActiveSupport.run_load_hooks(:active_record, ActiveRecord::Base)
在上面的示例中,它将执行在 ActiveRecord::Base
类中为 :active_record
注册的所有钩子。
来源:显示 | 在 GitHub 上
# 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