无法使用 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) 定义多个“包含”块的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Directory.Delete(path, true) 删除目录
如何修复:“无法识别的令牌'无法识别':期待('true','false'或'null')”使用Horton schema-registry