У нас есть приложение Rails.В lib
есть класс PriorityFilter
.Это простой класс ПОРО.Он явно не наследуется от других классов и не содержит никаких модулей.Однако, если я запускаю консоль 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 делает это.Вопросы:
- Правда ли, что Rails делает это для всех классов в
lib
? - Где Rails включает эти модули?
- Являются ли разные модуливключены в зависимости от контекста, где используется класс?Есть ли способ узнать, какие модули будут включены?
- Есть ли способ управления списком включенных модулей с помощью какого-либо параметра конфигурации?(Я понимаю, что модули могут быть явно включены и что они могут быть включены / исключены во время выполнения с помощью методов, доступных для каждого объекта.)