Rails: NameError: uninitialized constant

167,888

Solution 1

Some things to try:

  1. Restart the rails console; changes to your models will only get picked up by a rails console that is already open if you do > reload! (although I have found this to be unpredictable), or by restarting the console.

  2. Is your model file called "phone_number.rb" and is it in "/app/models"?

  3. You should double-check the "--sandbox" option on your rails console command. AFAIK, this prevents changes. Try it without the switch.

Solution 2

I was getting the error:

NameError: uninitialized constant

Then I noticed that I had accidentally created a plural model so I went back and renamed the model file to singular and also changed the class name in the model file to singular and that solved it.

Solution 3

I started having this issue after upgrading Rails 5.1 to 5.2
I got it solved with:

spring stop
spring binstub --all
spring start
rails s

Solution 4

I ran into this also with a file directly in the models directory, and it turns out that I wasn't properly loading up the code on startup. I was able to fix the issue by setting config.eager_load = true in my development.rb file. This made the class available to me in the console

Solution 5

If none of the above work, I also have a different approach, as it happened to me in a real scenario.

More specifically using auto-generated Ruby files from Thrift.


In my situation, I had a Module with several classes, so the order is important in this case:

Class A makes use of Class B in the same module. However, Class B was declared after Class A.

Simply making Class B to be declared before Class A solved the issue to me.

Share:
167,888
Nick stands with Ukraine
Author by

Nick stands with Ukraine

#SOreadytohelp

Updated on June 20, 2021

Comments

  • Nick stands with Ukraine
    Nick stands with Ukraine almost 3 years

    I have a simple model called PhoneNumber:

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

    I go to the root folder of the application (the one containing the app sub-folder) and start the console:

    rails console --sandbox
    

    When I try to create an empty PhoneNumber (I want to get an error message as the validation shall fail) I am getting the following error message:

    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
    

    It seems the console is not aware of the model. In plain ruby you need to 'require' the file containing the class but I thought that the rails console shall automatically load all models. What is going on here?

  • Nick stands with Ukraine
    Nick stands with Ukraine over 9 years
    It seems it was the name of the file - it was app/models/PhoneNumber.rb. When I changed it to app/models/phone_number.rb the error message disappeared.
  • lostphilosopher
    lostphilosopher over 7 years
    Here's more information on this solution: collectiveidea.com/blog/archives/2016/07/22/… tldr; "With Rails 5, autoloading is now completely disabled if config.eager_load = true."
  • Meekohi
    Meekohi almost 7 years
    reload! worked for me! Seems like some parts of the model initialization get cached, so if there is an error in that section it can become an "invisibile" error when you run the console a second time.
  • ferne97
    ferne97 about 4 years
    Thank you! Wasted hours on this.
  • Olivier JM
    Olivier JM about 4 years
    In my case the model was named in plural I just had to change that. Thank you
  • ispirett
    ispirett over 2 years
    Yes this is important.
  • Indika K
    Indika K about 2 years
    My problem was solved by restarting the rails console.