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 ответов
Несколько вещей, чтобы попробовать:
Перезапустите консоль рельсов; изменения в ваших моделях будут восприняты только консолью rails, которая уже открыта, если вы это сделаете
> reload!
(хотя я обнаружил, что это непредсказуемо), или перезапустив консоль.Файл вашей модели называется "phone_number.rb" и находится ли он в /app/models?
Вы должны дважды проверить опцию --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. "
В моем случае я назвал имя столбца 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.