gpt4 book ai didi

ruby - ActiveSupport::Concern 与 append_features

转载 作者:太空宇宙 更新时间:2023-11-03 16:33:06 24 4
gpt4 key购买 nike

an articleActiveSupport::Concern钩子(Hook)。这是 Rails 中的一个有效实现:

module ActionController
class Base < Metal
include AbstractController::Layouts
end
end

module AbstractController
module Layouts
extend ActiveSupport::Concern

include Rendering

included do
class_attribute :_layout, :_layout_conditions, :instance_accessor => false
self._layout = nil
self._layout_conditions = {}
_write_layout_method
end

module ClassMethods
...
end
end
end

module AbstractController
module Rendering
extend ActiveSupport::Concern

included do
class_attribute :protected_instance_variables
self.protected_instance_variables = []
end

module ClassMethods
...
end
end
end

extend怎么样了?来电Layoutsappend_features 之前执行 ruby 钩? extend必须首先执行。毕竟,它的全部意义在于劫持 append_features。 ruby 默认并重新实现它。然而,根据 Ruby 文档,append_features在您将此模块(例如 AbstractController::Layouts )包含在另一个模块(例如 ActionController::Base )中后立即执行。所以这里对我来说很困惑。如果是这种情况,则覆盖 append_featuresActiveSupport::Concern永远不会被调用。

最佳答案

这是我的看法:

您可以将“include”想象成一个将模块作为参数的方法;为了包含一个模块,该模块必须已经被环境加载;否则该行将因缺少常量错误而失败。

因此,当 include AbstractController::Layouts 被调用时,布局必须加载到 AbstractController 或顶级命名空间中才能工作。

查看 actionpack 源代码,发现 Layouts 是自动加载的,这确保它会在“include”行完成之前加载。

由于 extend ActiveSupport::Concern 在布局加载时执行,append_features 覆盖将可用到 ActionController::Base 中的“include”行完成执行时。

在此之后,Layouts 的 append_features 方法将以 ActionController::Base 作为参数执行。

关于ruby - ActiveSupport::Concern 与 append_features,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12546639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com