我们有一个Rails应用程序。 lib
中有一个名为PriorityFilter
的类。这是一个简单的PORO类。它不会显式继承其他类,也不包含任何模块。但是,如果我运行Rails控制台,我可以看到该类包含许多模块:
irb(main):002:0> PriorityFilter.included_modules => [ActiveSupport::ToJsonWithActiveSupportEncoder, ActionView::Helpers::NumberHelper, PP::ObjectMixin, ActiveSupport::Dependencies::Loadable, JSON::Ext::Generator::GeneratorMethods::Object, ActiveSupport::Tryable, Kernel]
该类在视图帮助器中使用,以准备用于渲染模板的数据。如果我在视图助手中放置调试器刹车点并检查包含的模块,则列表中甚至还有更多模块:
(byebug) PriorityFilter.included_modules [ActiveSupport::ToJsonWithActiveSupportEncoder, ActionView::Helpers::UrlHelper, ApplicationHelper, DateTimeHelper, Aligni::DateTimeFormatter, ActiveJob::TestHelper, UnitHelper, ActionView::Helpers::TextHelper, ActionView::Helpers::TagHelper, ActionView::Helpers::OutputSafetyHelper, ActionView::Helpers::CaptureHelper, ActionView::Helpers::SanitizeHelper, ActionView::Helpers::NumberHelper, PP::ObjectMixin, ActiveSupport::Dependencies::Loadable, JSON::Ext::Generator::GeneratorMethods::Object, ActiveSupport::Tryable, Kernel]
其中有一些帮助程序,例如ApplicationHelper
,DateTimeHelper
和UnitHelper
,实际上是在应用程序代码中定义的,而不是Rails。
我们进行了彻底检查,并且这些帮助程序没有明确地包含在我们应用程序代码中的此类(或其他类似类)中。因此,我怀疑Rails会这样做。问题是:
lib
中的所有类都这样做吗?答案 0 :(得分:1)
您的类(除非另有说明)从Object
继承,并且ActiveSupport
将自己的扩展名(也)添加到Object
类,例如here,并带有{{1 }}例如:
ActiveSupport::ToJsonWithActiveSupportEncoder
所以回答您的特定问题:
[Object, Array, FalseClass, Float, Hash, Integer, NilClass, String, TrueClass, Enumerable].reverse_each do |klass|
klass.prepend(ActiveSupport::ToJsonWithActiveSupportEncoder)
end
继承的类,则很可能不会包含任何类。我不确定,如何包括帮助者。我会尝试使用BasicObject
钩子来找到类似的东西:
included
然后我将启动该应用程序并查看回溯,也许它可以工作。