【问题标题】:`circular dependency` - inheritance in application controller of Rails 4.2.0 engine`循环依赖` - Rails 4.2.0 引擎的应用程序控制器中的继承
【发布时间】:2015-02-13 02:35:14
【问题描述】:

将引擎从 Rails 3.2 升级到 Rails 4.2.0 时,应用程序控制器中的以下继承导致 rspec 中出现circular dependency 错误:

class ApplicationController < ApplicationController
end

我们有 config.eager_load = false 用于 config/development.rb。

错误:

activesupport-4.2.0/lib/active_support/dependencies.rb:492:in `load_missing_constant': Circular dependency detected while autoloading con
stant Authentify::ApplicationController (RuntimeError)

这里是 Rails engine document (ch:4.3.2) 解释这种类型的代码实践。据我了解,这种继承的目的是允许引擎访问 Rails 应用程序或当前引擎安装到的其他引擎中的方法。我们想在 Rails 4.2.0 引擎中做同样的事情。如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    您的 applicationController 显然试图从自己继承,它应该看起来像

    class ApplicationController &lt; ActionController::Base

    【讨论】:

    • 请参考帖子中的rails引擎文档。这是 Rails 推荐的代码实践。
    • 如果是这样,你应该为你的控制器添加一个命名空间,它继承自 ApplicationController,就像这里 -> guides.rubyonrails.org/…,你不能从Something继承Something,因为它会导致循环依赖
    【解决方案2】:

    在 rails 4 引擎中,正确的格式是:

    class ApplicationController < ::ApplicationController
    end
    

    假设类在module MyEngine 内。或者

    class MyEngineName::ApplicationController < ::ApplicationController
    end
    

    【讨论】:

      猜你喜欢
      • 2015-09-27
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多