Недетерминированная ошибка имени: неинициализированная константа в модели ActiveRecord

#ruby-on-rails #ruby #activerecord

Вопрос:

Как указано в названии, я получаю NameError (uninitialized constant Workflow::Task) оценку за модель, определенную по адресу app/models/workflow/task.rb .

Я уверен, что определение модели правильное, потому что оно работает в 90% случаев, но в 10% случаев я получаю эту ошибку имени, и она выходит из строя. Я не могу воспроизвести локально, это происходит только в prod, где мы используем базу данных Amazon Aurora. Может ли это произойти, если есть проблемы с подключением к базе данных или что-то в этом роде? Любые указатели приветствуются

Использование рельсов 5.1.6.2

Комментарии:

1. Мне немного любопытно — вы определили класс как class Workflow::Task ... или правильно с явной вложенностью ( module Workflow; class Task )? Первое является магнитом ошибок и приводит к странным проблемам с автоматической и быстрой загрузкой. github.com/rubocop/ruby-style-guide#namespace-definition

2. Эта модель загружается автоматически из потока?

3. Спасибо @max! Явное объявление модуля устраняет проблему

Ответ №1:

Из сообщения об ошибке ясно, что это не проблема, связанная с базой данных. Проще говоря, Rails не загружает ваш класс модели.

Вы могли бы попробовать следующее:

  1. Как прокомментировал @max, определите свой класс как module Workflow; class Task .
  2. Вы можете вручную добавить файл в пути автоматической загрузки rails. Положи это в config/application.rb : config.autoload_paths << Rails.root.join('app/models/workflow')
    • Однако это не должно быть проблемой. Rails загружает все, что находится в app каталоге.

`

Комментарии:

1. Извините за поздний ответ, это правильно. Определение с помощью явного определения модуля устраняет проблему