奇怪 "rails superclass mismatch for class" 在 AWS 上,而本地 docker 运行良好

Strange "rails superclass mismatch for class" on AWS, while local docker runs fine

我决定将我网站的管理部分切换为管理 gem。在进行所有必要的更改和 运行 所有测试之后,一切似乎都可以推送到 AWS。尝试访问我的网站时,出现 503 错误。登录 AWS 显示我的 Fargate 任务崩溃并出现以下错误:

rails superclass mismatch for class EventsController

看来我定义这个调用的方式似乎是错误的,但我不明白为什么。

文件位于 /app/controllers/admin/ahoy/events_controller.rb 中,如下所示:

module Admin
  class Ahoy::EventsController < Admin::ApplicationController
  end
end

我不需要任何额外的逻辑,所以它很基本。我认为这可能是由模块引起的,所以我也尝试从 super class:

中删除 Admin
module Admin
  class Ahoy::EventsController < ApplicationController
  end
end

奇怪的是,这两个选项似乎在我的本地 docker 实例中都可以正常工作,但在 AWS 上却失败了。我正在为如何解决这个问题而苦苦挣扎。我的命名空间错了吗?

试试这个:

module Admin
  module Ahoy
    class EventsController < Admin::ApplicationController
    end
  end
end

如果这解决了您的问题,原因如下:您的代码有问题,但您的本地环境正在以避免该问题的顺序加载您的文件。

举个例子。使用以下内容创建一个独立的 Ruby 文件:

module Admin
end

#module Admin
  #module Ahoy
  #end
#end

module Admin
  class ApplicationController
  end
end

module Ahoy
  class EventsController
  end
end

module Admin
  class Ahoy::EventsController < Admin::ApplicationController
    def self.foo
    end
  end
end

如果你运行这个,你应该会看到同样的问题。现在再次取消注释 Admin::Ahoy 和 运行 的定义。它不应该引发任何错误。

注释了 Admin::Ahoy 的定义后,Ruby 达到了 Admin::Ahoy::EventsController 的定义,而没有预先存在的 Admin::Ahoy。但是它确实有一个模块 Ahoy(没有命名空间,也可以表示为 ::Ahoy),因此它假定这就是您所指的模块。因此,它尝试创建的 class 是 Ahoy::EventsController(没关系,你应该在 Admin 命名空间中)。现在的问题是Ahoy::EventsController已经存在,继承自Object(不说就是默认的),而这里说的是继承自Admin::ApplicationController。这是一个超级class 不匹配,这就是错误所指的内容。

您的应用程序可能具有 Admin::Ahoy 或类似的定义。但是,这并不是在生产中首先加载,这就是为什么您在一个环境而不是另一个环境中遇到错误的原因。用单独列出的每个模块定义您的 classes 应该可以避免您将来遇到类似的问题。