为什么在Rails控制台中`reload!`会导致“类的超类不匹配”(Rails 4)

问题描述 投票:0回答:1

我在Rails控制台中运行reload!时收到“类的超类不匹配”错误。我在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_idBaseClass实际上确实发生了变化。

为什么会发生这种情况?我检查了代码库中对MoreSpecific类的其他引用,因为我认为这可能会导致将BaseClass作为一个常量多次建立,但没有看到任何东西。

什么导致A:B:C::BaseClass的object_id在reload!之后切换?

ruby ruby-on-rails-4 inheritance autoload superclass
1个回答
1
投票

没有要求语句的自动加载模块

reload!是Rails控制台方法,不是标准的Ruby方法。尽管可能还会有其他原因导致您看到该行为,但值得注意的是,more_specific.rb中的C模块在运行时没有require base_class,并且可能会丢失其查找;如果没有它,Rails可能无法按您期望的方式autoload进行模块化。

请确保依赖BaseClass的模块包含要重新加载模块时要执行的require base_class语句。如果仍不能解决问题,则您的代码中可能还会存在其他问题,这些问题未在您当前的帖子中显示。

© www.soinside.com 2019 - 2024. All rights reserved.