Где Rails включает модули в класс из lib? - PullRequest
0 голосов
/ 02 октября 2018

У нас есть приложение 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 делает это.Вопросы:

  1. Правда ли, что Rails делает это для всех классов в lib?
  2. Где Rails включает эти модули?
  3. Являются ли разные модуливключены в зависимости от контекста, где используется класс?Есть ли способ узнать, какие модули будут включены?
  4. Есть ли способ управления списком включенных модулей с помощью какого-либо параметра конфигурации?(Я понимаю, что модули могут быть явно включены и что они могут быть включены / исключены во время выполнения с помощью методов, доступных для каждого объекта.)

1 Ответ

0 голосов
/ 02 октября 2018

Ваш класс, если не указано иное, наследуется от Object, а ActiveSupport добавляет свои собственные расширения (также) к классу Object, например здесь , с ActiveSupport::ToJsonWithActiveSupportEncoder, например:

[Object, Array, FalseClass, Float, Hash, Integer, NilClass, String, TrueClass, Enumerable].reverse_each do |klass|
  klass.prepend(ActiveSupport::ToJsonWithActiveSupportEncoder)
end

поэтому, чтобы ответить на ваши конкретные вопросы:

  1. Нет, если вы напишите класс, унаследованный от BasicObject, ни один из них не будет включен, скорее всего.
  2. В разных местах я приводил один пример, вы можете искать другие.
  3. Нет, он основан на цепочке наследования.
  4. Нет, насколько я знаю.

Я не уверен, однако, как включены помощники.Я бы попробовал что-то вроде этого, чтобы выяснить это, используя included hook:

module ApplicationHelper
  def self.included(base)
    binding.pry # or any other debugger
  end
end

А потом я запустил приложение и увидел бы обратную трассировку, возможно, это сработало бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...