首页 > 解决方案 > 为什么 Rails 控制台中的“重新加载!”会导致“类的超类不匹配”(Rails 4)

问题描述

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_idBaseClass确实发生了变化。

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

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

标签: rubyruby-on-rails-4inheritanceautoloadsuperclass

解决方案


没有 Require 语句的自动加载模块

reload!是 Rails 控制台方法,而不是标准 Ruby 方法。虽然您看到的行为可能还有其他原因,但值得注意的是more_specific.rb中的 C 模块在运行时不会require base_class,并且可能会丢失其查找;如果没有它, Rails 可能无法按照您期望的方式自动加载模块。

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


推荐阅读