Почему `reload!` В консоли Rails вызывает "несоответствие суперкласса для класса" (Rails 4) - PullRequest
0 голосов
/ 15 апреля 2020

Я получаю ошибку "несоответствие суперкласса для класса" при запуске reload! в консоли Rails. У меня есть некоторые супер простые классы, определенные в ruby, что-то вроде этого:

# base_class.rb
module A
  module B
    module C
      class BaseClass
        def close
          #stub
        end
      end
    end
  end
end

И:

# more_specific.rb
module A
  module B
    module C
      class MoreSpecific < BaseClass
        def initialize
          # ... 
        end

        def close
        end
      end
    end
  end
end

Я вижу, что на самом деле есть проблема, потому что если я сделаю это прежде чем я reload!:

A::B::C::MoreSpecific.superclass.equal? A::B::C::BaseClass

я получаю true, а затем, если я делаю это после того, как получаю ошибку, я получаю false. Кроме того, object_id из BaseClass действительно изменяется.

Почему это может случиться? Я проверил наличие дополнительных ссылок на класс MoreSpecific в кодовой базе, потому что я думал, что это может привести к тому, что BaseClass будет установлен как константа более одного раза, но ничего не увидел.

Что может быть причиной переключения object_id A:B:C::BaseClass после reload!?

1 Ответ

1 голос
/ 15 апреля 2020

Автозагрузка модулей без оператора Require *

reload! - это консольный метод Rails, а не стандартный Ruby метод. Хотя могут быть и другие причины поведения, которое вы видите, стоит отметить, что ваш C модуль в more_specifi c .rb не require base_class во время выполнения и может потерять его уважать; Rails не может автоматически загружать модули так, как вы ожидаете, без него.

Убедитесь, что модули, зависящие от BaseClass, содержат оператор require base_class, который будет выполняться при перезагрузке модуля. Если это не помогло, могут возникнуть и другие проблемы с вашим кодом, которые не отображаются в вашем текущем сообщении.

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