Rails在lib的类中的哪里包含模块?

时间:2018-10-02 09:03:42

标签: ruby-on-rails ruby

我们有一个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]

其中有一些帮助程序,例如ApplicationHelperDateTimeHelperUnitHelper,实际上是在应用程序代码中定义的,而不是Rails。

我们进行了彻底检查,并且这些帮助程序没有明确地包含在我们应用程序代码中的此类(或其他类似类)中。因此,我怀疑Rails会这样做。问题是:

  1. Rails是否对lib中的所有类都这样做吗?
  2. Rails在哪些地方包含那些模块?
  3. 基于使用类的上下文是否包括不同的模块?有没有办法找出要包含哪些模块?
  4. 是否可以通过某些配置选项控制所包含模块的列表? (我知道可以显式地包含模块,并且可以在运行时使用每个对象上可用的方法来包含/排除模块。)

1 个答案:

答案 0 :(得分:1)

您的类(除非另有说明)从Object继承,并且ActiveSupport将自己的扩展名(也)添加到Object类,例如here,并带有{{1 }}例如:

ActiveSupport::ToJsonWithActiveSupportEncoder

所以回答您的特定问题:

  1. 否,如果您编写从[Object, Array, FalseClass, Float, Hash, Integer, NilClass, String, TrueClass, Enumerable].reverse_each do |klass| klass.prepend(ActiveSupport::ToJsonWithActiveSupportEncoder) end 继承的类,则很可能不会包含任何类。
  2. 在各个地方,我举了一个例子,您可以搜索另一个例子。
  3. 不,它基于继承链。
  4. 据我所知,不。

我不确定,如何包括帮助者。我会尝试使用BasicObject钩子来找到类似的东西:

included

然后我将启动该应用程序并查看回溯,也许它可以工作。