Включена активная поддержка Rails: ошибка «неинициализированная константа» при использовании константы «включающий» - PullRequest
0 голосов
/ 29 мая 2020

Заявление об отказе от ответственности: я знаю, что это очень плохой шаблон, я просто хочу понять, почему у меня следующее поведение и механизмы, лежащие в его основе.

  • У нас будет один класс с некоторыми константами / методами
  • одна проблема
  • один патч обезьяны, который включает эту проблему в мой первый класс

Я поместил все следующее в одну модель рельсов ( в app / modela / a.rb)

class A
  MY_CONST = "const"

  def self.hello
    "world"
  end
end

module MyConcern
  extend ActiveSupport::Concern

  included do
    byebug # Here I want to try many things
  end
end

class A
  include MyConcern
end

Затем я открываю консоль и запускаю следующее, чтобы загрузить свой класс: [1] pry(main) > A

Сначала я мой A класс загружается, затем модуль MyConcern, затем патч обезьяны. Когда я вхожу в свой byebug, у меня странное поведение

(byebug) self
A                # Important : I'm in the scope of my A class
(byebug) hello
"world"          # so far so good, my A class is loaded and have a world class method
(byebug) A::MY_CONST
"const"          # Obiously this is working
(byebug) self::MY_CONST
"const"          # When I Explicitly access it through `self`, it's also working
(byebug) MY_CONST
*** NameError Exception: uninitialized constant MyConcern::MY_CONST

nil              # Here for some reason, and that's what I want to understand, I can't access my const, even if `self == A`

Я хочу 'знать, почему константы не работают одинаково. Почему ruby не может найти эту константу. Моя область действия - это мой класс A, self == A, так почему я не могу получить доступ к своей константе?

ps: Rails.version => "6.0.0"

...