1

我决定将我网站的管理部分切换为管理 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

我不需要任何额外的逻辑,所以它是非常基本的。我认为它可能是由模块引起的,所以我也尝试Admin从超类中删除:

module Admin
  class Ahoy::EventsController < ApplicationController
  end
end

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

4

1 回答 1

1

试试这个:

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),因此它假定这是您所指的模块。因此,它试图创建的类是Ahoy::EventsController(没关系你应该在Admin命名空间中)。现在的问题是它Ahoy::EventsController已经存在,并且继承自Object(如果您不另外说,则为默认值),而在这里您说它继承自Admin::ApplicationController. 这是一个超类不匹配,这就是错误所说的。

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

于 2020-02-29T20:24:50.507 回答