NameError: неинициализированная константа (rails)

У меня есть простая модель под названием PhoneNumber:

class PhoneNumber < ActiveRecord::Base
  validates :pnumber, presence: true, on: :create #=> { :message => " cannot be blank" }
  validates :pnumber, numericality: true, on: :create
end

Я иду в корневую папку приложения (та, которая содержит подпапку приложения) и запускаю консоль:

rails console --sandbox

Когда я пытаюсь создать пустой PhoneNumber (я хочу получить сообщение об ошибке, так как проверка не будет выполнена), я получаю следующее сообщение об ошибке:

2.0.0-p451 :001 > PhoneNumber.new
NameError: uninitialized constant PhoneNumber
from (irb):1
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/commands/console.rb:90:in `start'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/commands/console.rb:9:in `start'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/commands/commands_tasks.rb:69:in `console'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/commands/commands_tasks.rb:40:in `run_command!'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/commands.rb:17:in `<top (required)>'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/app_rails_loader.rb:43:in `require'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/app_rails_loader.rb:43:in `block in exec_app_rails'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/app_rails_loader.rb:32:in `loop'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/app_rails_loader.rb:32:in `exec_app_rails'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/lib/rails/cli.rb:5:in `<top (required)>'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/bin/rails:9:in `require'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/gems/railties-4.1.5/bin/rails:9:in `<top (required)>'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/bin/rails:23:in `load'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/bin/rails:23:in `<main>'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/bin/ruby_executable_hooks:15:in `eval'
from /Users/nnikolo/.rvm/gems/ruby-2.0.0-p451@railstutorial_rails_4_0/bin/2.2.2.02.02.02.0.2.2.02.222222.2.02.02.0.2.2.022222222222222

Кажется, консоль не знает о модели. В обычном ruby ​​вам нужно "требовать" файл, содержащий класс, но я подумал, что консоль rails автоматически загрузит все модели. Что здесь происходит?

17 ответов

Решение

Несколько вещей, чтобы попробовать:

  1. Перезапустите консоль рельсов; изменения в ваших моделях будут восприняты только консолью rails, которая уже открыта, если вы это сделаете > reload! (хотя я обнаружил, что это непредсказуемо), или перезапустив консоль.

  2. Файл вашей модели называется "phone_number.rb" и находится ли он в /app/models?

  3. Вы должны дважды проверить опцию --sandbox в вашей консоли консоли rails. AFAIK, это предотвращает изменения. Попробуйте это без выключателя.

Я получаю ошибку:

NameError: uninitialized constant

Затем я заметил, что случайно создал множественную модель, поэтому я вернулся и переименовал файл модели в единственное, а также изменил имя класса в файле модели на единственное, и это решило проблему.

У меня появилась эта проблема после обновления с Rails 5.1 до 5.2
Это было решено с помощью:

spring stop
spring binstub --all
spring start
rails s

Я столкнулся с этим также с файлом прямо в models каталог, и оказывается, что я не загружал код при запуске. Я смог решить проблему, установив config.eager_load = true в моем файле development.rb. Это сделало класс доступным для меня в консоли

Моя проблема также была решена путем проверки того, что имя файла совпадает с именем класса с правильными соглашениями, например class AdLikes имеет имя файла ad_likes.rb

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

В частности, с использованием автоматически сгенерированных файлов Ruby от Thrift.


В моей ситуации у меня был Module с несколькими классами, поэтому порядок важен в этом случае:

Class A использует Class B в том же модуле. Тем не мение, Class B был объявлен после Class A,

Просто делая Class B быть объявленным раньше Class A решил вопрос для меня.

Аналогично с @ Майкл-Нил.

Я назвал контроллер как единственное число. app / controllers /product_controller.rb

Когда я переименовал его во множественное число, ошибка решена. app / controllers /products_controller.rb

У меня была такая же проблема при работе над приложением Rails 6 в Ubuntu 20.04 .

Когда я запускаю консоль rails с помощью команды

      rails console

а затем запустите команду ниже, чтобы вывести список всех доступных ролей.


Я получаю сообщение об ошибке ниже:

      Traceback (most recent call last):
        1: from (irb):2
NameError (uninitialized constant Role)

Вот как я это исправил :

Проблема заключалась в том, что мой Role модель была помещена в пространство имен с модулем Userbase. Итак, вместо этого:

      Role.all

Должно получиться так:

      Userbase::Role.all

Это все

надеюсь, это поможет

У меня была эта проблема, потому что я изменил имя класса в модели, и оно не совпадало с именем файла.

"Имена классов моделей используют CamelCase. Они единичны и будут автоматически отображаться на имя таблицы множественной базы данных.

Файлы моделей находятся в app / models / # {singular_model_name}.rb. "

https://gist.github.com/iangreenleaf/b206d09c587e8fc6399e

В моем случае я назвал имя столбца type и попытался установить его значение как UNPREPARED. И я получил такое сообщение об ошибке:

Вызвано: api_1 | NameError: неинициализированная константа UNPREPARED

В рельсах, колонна type зарезервировано:

ActiveRecord::SubclassNotFound: механизму наследования одной таблицы не удалось найти подкласс: "UNPREPARED". Эта ошибка возникает из-за того, что столбец "тип" зарезервирован для хранения класса в случае наследования. Пожалуйста, переименуйте этот столбец, если вы не собирались использовать его для хранения класса наследования, или перезаписать Food.inheritance_column, чтобы использовать другой столбец для этой информации.

У меня была похожая ошибка, но это было потому, что я создал has_one отношения и впоследствии удалили модель, что это had_one из. Я просто забыл удалить has_one Отношения с оставшейся моделью.

Привет, у меня такая же проблема, я решил ее, просто указав контроллер на вашем/config/routes.rbнайти маршрут поставить имя контроллера.

Пример: у меня есть контроллерproduct_controller.rb

маршруты.rb

      resource :product, controller: 'product', only: [:edit, :update]

У меня такая же ошибка. Была проблема с соглашением об именах с классами. У меня было имя файлаcheckitemgroup_query.rbно я инициализировал класс какCheckitemGroupQuery. Заменив имя класса наCheckitemgroupQueryмоя проблема была решена.

Этот тип исключений стар, как время, когда дело касается Ruby on Rails, но я только что столкнулся с его версией, связанной с константами (с заглавными буквами) и порядком загрузки кода.

По сути, у меня была проверка, которая ссылалась на константу, определенную прямо под проверкой, и я столкнулся с:

uninitialized constant Role::PERMISSIONS (NameError)

Это отбросило меня на пару минут, но я понял, в чем проблема, и решил ее, переместив определение РАЗРЕШЕНИЯ выше проверки, которая на него ссылалась.

У меня это началось при обновлении до Rails 7.

Оказывается, эта ошибка может возникнуть, если приложение автоматически загрузило перезагружаемые объекты во время процесса инициализации.

Я нашел ответ StackOverflow , который относится к этому руководству - согласно этому руководству:

Приложения, которые автоматически загружали перезагружаемые константы во время инициализации за пределами блоков to_prepare, выгружали эти константы и выдавали это предупреждение, начиная с Rails 6.0:
/ предупреждение об устаревании /
Если вы все еще получаете это предупреждение в журналах, пожалуйста, проверьте раздел об автозагрузке при загрузке приложения. руководство . В противном случае вы получите NameError в Rails 7 .

У меня была автозагрузка перезагружаемых объектов на этапе инициализации приложения. После обертывания его

Rails.application.config.to_prepare doиendкак было предложено по автозагрузкев руководстве по автозагрузке, проблема решена.

Подкину свой опыт, вдруг кому пригодится.

тл;др; база данных приложения не была создана в СУБД.

Внезапно я начал получать это, когда пытался запустить любой тест для одного класса подapp/models. Он не менялся с веками, но я дважды проверил, что он соответствует правилам имен файлов/классов, но безрезультатно.

Поскольку обратная трассировка указывала на нетерпеливую_загрузку, я просмотрел прекрасную ссылку , предоставленную @lostphilosopher в комментарии выше. Поэтому в качестве первого шага я попытался отключить нетерпеливую_загрузку.

Выполнить не удалось с ошибкой, что база данных не найдена. После создания БД начала работать как жадная, так и не жадная загрузка. Я понятия не имею, почему ошибка так вводила в заблуждение в нетерпеливом режиме. Но сейчас нет времени копаться в этом.

Просто подумал, что кто-то может найти это полезным.

У меня была такая же ошибка. Оказывается, в моих поспешных лесах я пропустил файл model.rb.

Другие вопросы по тегам