2014-10-15 2 views
15

У меня есть простая модель под названием PhoneNumber:NameError: неинициализированные постоянные (рельсы)

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/[email protected]_rails_4_0/gems/railties-4.1.5/lib/rails/commands/console.rb:90:in `start' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/gems/railties-4.1.5/lib/rails/commands/console.rb:9:in `start' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/gems/railties-4.1.5/lib/rails/commands/commands_tasks.rb:69:in `console' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/gems/railties-4.1.5/lib/rails/commands/commands_tasks.rb:40:in `run_command!' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/gems/railties-4.1.5/lib/rails/commands.rb:17:in `<top (required)>' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/gems/railties-4.1.5/lib/rails/app_rails_loader.rb:43:in `require' 
from /Users/nnikolo/.rvm/gems/[email protected]_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/[email protected]_rails_4_0/gems/railties-4.1.5/lib/rails/app_rails_loader.rb:32:in `loop' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/gems/railties-4.1.5/lib/rails/app_rails_loader.rb:32:in `exec_app_rails' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/gems/railties-4.1.5/lib/rails/cli.rb:5:in `<top (required)>' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/gems/railties-4.1.5/bin/rails:9:in `require' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/gems/railties-4.1.5/bin/rails:9:in `<top (required)>' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/bin/rails:23:in `load' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/bin/rails:23:in `<main>' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/bin/ruby_executable_hooks:15:in `eval' 
from /Users/nnikolo/.rvm/gems/[email protected]_rails_4_0/bin/2.2.2.02.02.02.0.2.2.02.222222.2.02.02.0.2.2.022222222222222 

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

ответ

36

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

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

  2. Является ли ваш файл модели «phone_number.rb» и находится ли он в «/ app/models»?

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

+3

Кажется, это было имя файла - это было приложение/модели/PhoneNumber.rb. Когда я изменил его на app/models/phone_number.rb, сообщение об ошибке исчезло. – Nick

+0

'reload!' Работал для меня! Кажется, что некоторые части инициализации модели получаются кэшированными, поэтому, если в этом разделе есть ошибка, она может стать «невидимой» ошибкой при повторном запуске консоли. – Meekohi

19

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

NameError: uninitialized constant

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

0

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

0

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

Более конкретно, используя созданные вручную файлы Ruby от Thrift.


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

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

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

3

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

+0

Это работает для меня ... спасибо приятелю –

+1

Вот еще информация об этом решении: http://collectiveidea.com/blog/archives/2016/07/22/solutions-to-potential-upgrade-problems-in-rails- 5/ tldr; «С Rails 5 автозагрузка теперь полностью отключена, если config.eager_load = true». – lostphilosopher

+0

спасибо! наткнулся на это сегодня, работал для меня –

1

Похожие на @ Michael-Neal.

Я назвал контроллер как единственное. приложение/контроллеры/product_controller.rb

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

Смежные вопросы