自动加载常量时检测到循环依赖(Rails 4、Ruby 2)

Posted

技术标签:

【中文标题】自动加载常量时检测到循环依赖(Rails 4、Ruby 2)【英文标题】:Circular dependency detected while autoloading constant (Rails 4, Ruby 2) 【发布时间】:2014-07-10 13:00:58 【问题描述】:

configs/routes.rb ShuttersPaintsJobs 的子资源。

resources :jobs do
    resources :shutters
    resources :paints
end

app/models/job.rb 一个Job 包含许多Shutters 和许多Paints

class Job < ActiveRecord::Base
    has_many :shutters, dependent: :delete_all
    has_many :paints, dependent: :delete_all

    accepts_nested_attributes_for :shutters, allow_destroy: true, :reject_if => lambda  |a| a[:no].blank? 
    accepts_nested_attributes_for :paints, allow_destroy: true, :reject_if => lambda  |a| a[:name].blank? `

app/models/shutter.rb 一个Shutter 包含属于一个Job 和一个Paint

class Shutter < ActiveRecord::Base
    belongs_to :job
    belongs_to :paint

app/models/paint.rb Paint 属于一个 Job,但在该作业中可以被许多 Shutters 引用。

class Paint < ActiveRecord::Base
    belongs_to :job
    has_many :shutters

如果数据库中没有PaintsJobs#showJobs#edit 都可以正常使用代码&lt;%= debug @job.paints %&gt;。但是在添加油漆的那一刻,会引发 RuntimeError,“自动加载常量 PAINT 时检测到循环依赖”。

修复此错误的最佳方法是什么?

编辑:控制器信息

app/controllers/jobs_controller.rb

class JobsController < ApplicationController
    before_action :set_job, only: [:show, :edit, :update, :destroy]

    ...

    # GET /jobs/1
    # GET /jobs/1.json
    def show
    end

    # GET /jobs/new
    def new
        @job = Job.new
        @job.shutters.build
        @job.paints.build
    end

    # GET /jobs/1/edit
    def edit
        @job.shutters.build
        @job.paints.build
    end

app/controllers/shutters_controller.rb

class ShuttersController < ApplicationController
    def new
        @shutter = Shutter.new
    end

    def destroy
        @shutter = Shutter.find(params[:id])
        @job = Job.find(@shutter[:job_id])
        @shutter.destroy
        respond_to do |format|
            format.html redirect_to @job, notice: 'Shutter was succesfully deleted.' 
        end
    end
end

app/controllers/paints_controller.rb

class PaintsController < ApplicationController
    def new
        @paint = Paint.new
    end

    def destroy
        @paint = Paint.find(params[:id])
        @job = Job.find(@paint[:job_id])
        @paint.destroy
        respond_to do |format|
            format.html redirect_to @job, notice: 'Paint was succesfully deleted.' 
        end
    end
end

【问题讨论】:

添加“绘画”的控制器代码是什么样子的 @Iceman 在我的帖子中添加了控制器代码。 @Iceman 据我所知,不需要。他们的关键是Shutter 模型在相同的代码下工作得非常好。我只是为Paint 控制器复制粘贴。两个模型的实际创建逻辑都在JobsController 中。 【参考方案1】:

问题不在于这些。实际上,我的Paint 模型包含一个名为:type 的字段,它是元分类或类似的保留关键字。谢天谢地,得到了#RubyOnRails 的好心人的帮助,否则像我这样的新手会尝试从头开始,遇到同样的问题,并且永远不会想到这一点。希望这对未来的 Google 员工有所帮助。提前付款!

【讨论】:

谢谢;我遇到了完全相同的问题。添加新的保留关键字总是很棒... @bigtunacan 帮助被一些看似不可能的错误困扰的可怜的谷歌搜索灵魂一直是我的梦想。我很高兴能够回馈社区! 你们中有人知道有保留关键字完整列表的资源吗?在运行我们的规范时,我们也会随机收到此错误。但正如我所见,我们在任何模型中都不使用保留关键字... @mfittko - 这可能有用:bparanj.blogspot.in/2011/07/reserved-words-in-rails.html 作为澄清,Rails 中的type 字段用于“单表继承”。基本上,它允许您对模型进行子类化,并将所有子类存储在单个数据库表中。 type 将您的 Dog 子类与您的 Animal 类区分开来,同时将它们存储在同一个数据库表中

以上是关于自动加载常量时检测到循环依赖(Rails 4、Ruby 2)的主要内容,如果未能解决你的问题,请参考以下文章

Rails 控制台:无法自动加载常量

Rails 5.2.0 中的“无法自动加载常量”错误

rails 应用程序给出错误“无法从 ru.yml 路径 加载翻译预期它返回一个哈希,但没有”

javascript 中类似 Rails 的自动加载 - 允许依赖于 webpack 中的根包

如何解决使用 Angular 4 检测到的循环依赖?

Rails 4 - 我如何自动检测用户的位置并将其显示在 Web 应用程序上?