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

У меня есть простая модель под названием 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

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


person Nick    schedule 15.10.2014    source источник
comment
Чтобы исправить это, мне просто нужно было указать во множественном числе имя модели в имени файла миграции, например, 20180612create_users.rb   -  person fungusanthrax    schedule 18.07.2018


Ответы (12)


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

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

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

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

person Dan Laffan    schedule 15.10.2014
comment
Похоже, это было имя файла - app / models / PhoneNumber.rb. Когда я изменил его на app / models / phone_number.rb, сообщение об ошибке исчезло. - person Nick; 16.10.2014
comment
reload! у меня сработало! Похоже, что некоторые части инициализации модели кэшируются, поэтому, если в этом разделе есть ошибка, она может стать невидимой ошибкой при повторном запуске консоли. - person Meekohi; 16.05.2017
comment
В моем случае модель была названа во множественном числе, мне просто пришлось это изменить. Спасибо - person Olivier JM; 13.03.2020

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

NameError: uninitialized constant

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

person killscreen    schedule 18.04.2015

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

spring stop
spring binstub --all
spring start
rails s
person user9869932    schedule 29.05.2018
comment
Спасибо! Зря потратил на это часы. - person ferne97; 13.03.2020

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

person bradley2w1dl    schedule 29.09.2016
comment
Подробнее об этом решении: collectidea.com/blog/archives/2016/07/22/ tldr; В Rails 5 автозагрузка теперь полностью отключена, если config.eager_load = true. - person lostphilosopher; 11.01.2017

Подобно @ Michael-Neal.

Я назвал контроллер особенным. app / controllers / product_controller.rb

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

person Uğur Aldanmaz    schedule 15.01.2017

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

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


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

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

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

person Matheus Felipe    schedule 09.09.2016

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

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

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

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

person MrMojoRisin    schedule 28.05.2019

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

person jared    schedule 10.06.2015

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

person therealrodk    schedule 07.05.2018

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

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

В рельсах зарезервирован столбец type:

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

person glinda93    schedule 11.06.2020

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

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

rails console

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

Role.all

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

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

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

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

Role.all

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

Userbase::Role.all

Это все

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

person Promise Preston    schedule 29.04.2021

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

person Jenny Lindgren    schedule 06.05.2021