【问题标题】:Circular dependency detected while autoloading a constant自动加载常量时检测到循环依赖
【发布时间】:2013-09-20 16:00:54
【问题描述】:

我将 Rails 从版本 3.1.2(运行良好)升级到 4.0,但遇到以下错误:

circular dependency detected while autoloading constant Foo

我创建了一个类ProductFactory,我在其中实例化了不同的模型。例如:

p = Foo.new(params)

模型 "Foo" 并不总是 ActiveRecord。谁能帮我解决这个问题?

【问题讨论】:

  • 你能展示一下你的工厂是什么样子的吗? Foo 仅在方法内部吗?或者你正在做一些元编程?还是将带有类的数组分配给不同的常量?
  • @IsmaelAbreu ProductFactory 的结构如下:基于条件(case..when)我用引用分配一个变量 p到对象 p = Cat.new(params)p = Dog.new(params)。在我的函数结束时,我返回 p。此外,我的产品工厂包括 Singleton。
  • 完整的堆栈跟踪在哪里?

标签: ruby ruby-on-rails-4 rails-activerecord


【解决方案1】:

据我所知,循环依赖错误消息通常发生在级联包含出错时,通过在完全加载之前递归地要求文件,例如:

# File A:
require 'B'
module Foo; end

# File B:
require 'A'
module Foo; end

你最终会遇到这种情况吗?

【讨论】:

  • 很多时候像lat, lon = Latitude.new, Longitude.new 这样的东西也会抛出这个错误,如果LatitudeLongitude 碰巧继承自同一个类,比如Coordinate
【解决方案2】:

我遇到了这个错误,因为我手动重命名了控制器、路由等,但忘记在文件的第一行重命名它。

被命名

类 AController

而不是

类 ANamedController

我已经单独重命名了所有其他文件。

不是我所知道的最佳实践,但我正在学习并弄清楚它,在这种情况下造成了这个人正在谈论的错误。因此,如果您像我一样通过 Google 来到这里,那么这就是我的解决方案。

【讨论】:

  • 重命名模块后发生在我身上,但忘记更改文件名
【解决方案3】:

当您更改 Rails 的版本时,经常会发生此类问题。您可能没有按正确的顺序更新宝石。

【讨论】:

  • 我不知道如何/为什么,但是以不同的顺序卸载和重新安装我所有的 gems...谢谢。
  • 更新 gem shot 是您的问题吗?
  • 我很想在这里看到更多的解释。另外:当 Rails 依赖于 bundler 时,怎么会发生这种情况?
猜你喜欢
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多