【问题标题】:Cannot define multiple 'included' blocks for a Concern (ActiveSupport::Concern::MultipleIncludedBlocks) with cache_classes = true无法使用 cache_classes = true 为关注 (ActiveSupport::Concern::MultipleIncludedBlocks) 定义多个“包含”块
【发布时间】: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 完成的,应该如何处理这样的问题?

【问题讨论】:

    标签: ruby-on-rails activesupport


    【解决方案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 自动加载规则。那是

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

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

        【讨论】:

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