【发布时间】:2019-03-07 09:30:45
【问题描述】:
我们有一个 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, 内核]
该类在视图助手中使用,为渲染模板准备数据。如果我在视图助手中放置一个调试器刹车点并检查包含的模块,列表中的模块会更多:
(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 会这样做。问题是:
- Rails 是否对
lib中的所有类都这样做? - Rails 在哪里包含这些模块?
- 是否根据使用类的上下文包含不同的模块?有没有办法找出将包含哪些模块?
- 有没有办法通过一些配置选项来控制包含的模块列表? (我知道模块可以被显式包含,并且可以在运行时使用每个对象上可用的方法来包含/排除它们。)
【问题讨论】:
-
是的。那是我寻找答案的第一个地方。但是我没有找到任何与我描述的状态相关的东西。
标签: ruby-on-rails ruby