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

Posted

技术标签:

【中文标题】无法使用 cache_classes = true 为关注 (ActiveSupport::Concern::MultipleIncludedBlocks) 定义多个“包含”块【英文标题】:Cannot define multiple 'included' blocks for a Concern (ActiveSupport::Concern::MultipleIncludedBlocks) with cache_classes = true 【发布时间】:2014-08-06 07:50:55 【问题描述】:

我有一个用于 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) 异常。

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

【问题讨论】:

【参考方案1】:

在我的例子中,我安装了一个 gem,它使用与我们关注的相同的模块名称。几年来,这并没有在开发或生产中引起任何已知问题,但我们在第一次安装 Sorbet 并尝试运行 sorbets init 命令时开始收到此错误。

更具体地说,addressable (2.7.0) 列在我们的 Gemfile.lock 中(作为另一个 gem 的依赖项安装,我们没有明确使用这个 gem)。我们还担心:

module Addressable
  extend ActiveSupport::Concern

  included do
  end
end

重命名我们的关注点解决了这个问题。

【讨论】:

【参考方案2】:

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

在我的情况下,我在运行 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 

【讨论】:

【参考方案3】:

对于任何碰壁阅读的人来说,解决这个问题的方法是严格遵守 Rails 自动加载规则。那是

    删除所有 require / require_relative 将所需的路径添加到 Rails 自动加载路径 将文件以正确的名称放在正确的位置,以便 Rails 可以推断在何处查找要加载的代码。

更多信息在这里:https://github.com/rails/rails/issues/15767

【讨论】:

感谢一段时间以来一直在努力寻找这个问题。我已将 lib 重构为关注点并开始出现此错误 对于我正在进行的项目,文件中明确需要该模块(除了在自动加载路径中)。我们在使用 Sidekiq 时开始遇到这个问题。解决方案是删除对模块的显式调用。 我还有一个问题,我的一个模块/命名空间名称以 s 结尾,我认为它不能很好地与 Rails 复数化配合使用,因为只需将模块重命名为单一形式即可?。 可惜!!同样在这里@CyrilDuchon-Doris ??? 正确!我在启动“Sidekiq”服务器时遇到了这个问题 但是对于一个文件,删除最后一个 's' 对我不起作用。所以我将 config.autoload_paths 添加到 application.rb 并从文件中删除了 require 调用。然后只有 sidekiq 开始运行。

以上是关于无法使用 cache_classes = true 为关注 (ActiveSupport::Concern::MultipleIncludedBlocks) 定义多个“包含”块的主要内容,如果未能解决你的问题,请参考以下文章

未提供 Rails Cloudfront 资产

无法使用 Directory.Delete(path, true) 删除目录

如何修复:“无法识别的令牌'无法识别':期待('true','false'或'null')”使用Horton schema-registry

Rails 没有在开发模式下重新加载我的模型

使用 serverSide 后,带有 Ajax 的 DataTable 无法正常工作:true

设置 minifyEnabled 为 true 时无法使用 GSON 解析 json 对象