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/[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

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

NameError: uninitialized constant

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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


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

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

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