Странное "несоответствие rails superclass для класса" на AWS, в то время как локальный docker работает нормально - PullRequest
0 голосов
/ 29 февраля 2020

Я решил переключить раздел администрирования моего сайта на администрирование gem. После внесения всех необходимых изменений и запуска всех тестов все выглядит нормально для pu sh до 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

Мне не нужны никакие дополнительные логи c, так что он довольно прост c , Я подумал, что это может быть вызвано модулем, поэтому я также попытался удалить Admin из суперкласса:

module Admin
  class Ahoy::EventsController < ApplicationController
  end
end

Странно то, что оба варианта работают нормально в моем локальном docker экземпляр, но не на AWS. Я как бы борюсь за то, чтобы решить эту проблему. Я неправильно назвал это пространство имен?

1 Ответ

1 голос
/ 29 февраля 2020

Попробуйте:

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 или аналогичное. Однако это не первая загрузка в производство, и именно поэтому вы получаете ошибку в одной среде, а не в другой. Определение классов с каждым отдельно перечисленным модулем должно избежать подобных проблем в будущем.

...