【问题标题】:Undefined Class/Module when Serializing序列化时未定义的类/模块
【发布时间】:2017-07-03 01:26:10
【问题描述】:

我在 ActiveRecord 模型中存储了一个类型化对象数组,例如:

class Store::Bin < ActiveRecord::Base
  serialize :items, Array
end

class Store::Item
   include Virtus.model
   attribute :name, String
   ...
end

当我在 development 模式下更改代码并刷新浏览器时,我收到了 undefined class/module Store::Item 异常。

似乎有些东西与类加载越界了。所有文件都在 app/models/store/... 目录中,正确命名为 w/r 到它们的驼峰名称。

使用 rails 控制台时也会出现同样的问题。 reload! 没有解决控制台中的问题;相反,我必须退出并重新启动控制台。

【问题讨论】:

    标签: ruby-on-rails serialization eager-loading


    【解决方案1】:

    向数组中添加类型似乎可以解决问题....但导致关联的 FactoryGirl 工厂出现问题。

    class Store::Bin < ActiveRecord::Base
      serialize :items, Array[Store::Item]
    end
    

    更新:真正的问题是,当对 store/bin.rb 进行代码更改时,该类会自动加载,但自动加载器不知道 Store::Item 是一个依赖项。

    真正的修复:使用 require_dependency 声明所需的依赖项

    require_dependency "store/item"
    class Store::Bin < ActiveRecord::Base
      serialize :items, Array
    end
    

    【讨论】:

      【解决方案2】:

      由于 Rails 自动加载问题,在定义类时应避免使用 :: 运算符。相反,尝试

      module Store
        class Item
           # ...
        end
      end
      

      当您不确定发生了什么时,您可以使用Module.nesting 来了解 Rails 如何解释层次结构。

      【讨论】:

      • 不幸的是,单独指定模块并没有解决我的问题,因为它与自动加载器没有看到对序列化类的要求有关:Store::Item
      猜你喜欢
      • 2011-04-06
      • 2015-03-12
      • 1970-01-01
      • 2021-09-21
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多