无法使用cache_classes = true为Concern(ActiveSupport :: Concern :: MultipleIncludedBlocks)定义多个“包含”块

时间:2014-06-16 13:08:50

标签: ruby-on-rails activesupport

我有一个在Rails 4.1.1应用程序中使用的模块

module A
   extend ActiveSupport::Concern
   included do
     #Some code
   end
end

包含在类

class Some
  include A
end

这适用于cache_classes=true中的application.rb。现在,如果我关闭类的缓存,我会在启动服务器时获得Cannot define multiple 'included' blocks for a Concern (ActiveSupport::Concern::MultipleIncludedBlocks)异常upson。

由于重新加载类是由Rails完成的,应该如何处理这样的问题?

2 个答案:

答案 0 :(得分:47)

对于任何打同一面墙的人来说,解决方法是严格遵守Rails自动加载规则。那是

  1. 删除所有require / require_relative
  2. 向Rails自动加载路径添加所需路径
  3. 使用正确的名称将文件放在正确的位置,以便Rails可以推断在哪里查找要加载的代码。
  4. 此处有更多信息:https://github.com/rails/rails/issues/15767

答案 1 :(得分:1)

您也可能有两个名字相同的问题。

就我而言,我在运行rails swagger:docs SD_LOG_LEVEL=1时遇到此错误。

$ rails swagger:docs SD_LOG_LEVEL=1

Cannot define multiple 'included' blocks for a Concern
1.0: 19 processed / 49 skipped

因为我有两个同名的swagger文件。

module SwaggerDocs::TrackerPhases
  extend ActiveSupport::Concern
  included do
  end
end

module SwaggerDocs::TrackerPhases
  extend ActiveSupport::Concern
  included do
  end
end

我将第二个文件重命名为:

module SwaggerDocs::ClientTrackerPhases
  extend ActiveSupport::Concern
  included do
  end
end