奇怪 "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 应该可以避免您将来遇到类似的问题。
我决定将我网站的管理部分切换为管理 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 应该可以避免您将来遇到类似的问题。