Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot load `Rails.application.database_configuration`: (NoMethodError) with launching to Heroku

I'm an intermediate Rails developer and I am using a remote database as my sole connection in a production environment. My stack is Rails 5 and Ruby 2.4.0. I have already set the environment variables up for the database such as USERNAME and PASSWORD. When I deploy to Heroku I get this error message:

Cannot load `Rails.application.database_configuration`: (NoMethodError)
undefined method `[]' for nil:NilClass

I'm assuming this is because that Rails can't see the environment variables, but even when I hard coded the username and password for the database for testing the same error occurs.

Here's my database.yml

default: &default
    adapter: mysql2
    encoding: utf8
    pool: 5


socket: /tmp/mysql.sock
  reconnect: true

development:
  <<: *default
    database: hittrax_tournaments_development
    username: root
    password: <%= ENV['DB_PASSWORD'] %>

test:
  <<: *default
  database: hittrax_tournaments_test
  username: root
  password: <%= Rails.application.secrets[:database][:password] %>

production:
  adapter: mysql2
  database: <%= ENV['DATABASE'] %>
  username: <%= ENV['USERNAME'] %>
  password: <%= ENV['PASSWORD'] %>
  host: <%= ENV['HOST'] %>
  port: 3306

Here's the stack trace

/app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/xml_mini.rb:51: warning: constant ::Fixnum is deprecated
/app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/xml_mini.rb:52: warning: constant ::Bignum is deprecated
/app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/core_ext/numeric/conversions.rb:138: warning: constant ::Fixnum is deprecated
(erb):12:in `<main>': Cannot load `Rails.application.database_configuration`: (NoMethodError)
undefined method `[]' for nil:NilClass
    from /app/vendor/ruby-2.4.0/lib/ruby/2.4.0/erb.rb:896:in `eval'
    from /app/vendor/ruby-2.4.0/lib/ruby/2.4.0/erb.rb:896:in `result'
    from /app/vendor/bundle/ruby/2.4.0/gems/railties-5.0.1/lib/rails/application/configuration.rb:137:in `database_configuration'
    from /app/vendor/bundle/ruby/2.4.0/gems/activerecord-5.0.1/lib/active_record/railtie.rb:122:in `block (2 levels) in <class:Railtie>'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/lazy_load_hooks.rb:43:in `instance_eval'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/lazy_load_hooks.rb:43:in `execute_hook'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/lazy_load_hooks.rb:50:in `block in run_load_hooks'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/lazy_load_hooks.rb:49:in `each'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/lazy_load_hooks.rb:49:in `run_load_hooks'
    from /app/vendor/bundle/ruby/2.4.0/gems/activerecord-5.0.1/lib/active_record/base.rb:324:in `<module:ActiveRecord>'
    from /app/vendor/bundle/ruby/2.4.0/gems/activerecord-5.0.1/lib/active_record/base.rb:24:in `<top (required)>'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:293:in `require'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:293:in `block in require'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:259:in `load_dependency'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:293:in `require'
    from /app/app/models/application_record.rb:1:in `<top (required)>'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:293:in `require'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:293:in `block in require'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:259:in `load_dependency'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:293:in `require'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:380:in `block in require_or_load'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:37:in `block in load_interlock'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies/interlock.rb:12:in `block in loading'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/concurrency/share_lock.rb:150:in `exclusive'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies/interlock.rb:11:in `loading'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:37:in `load_interlock'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:358:in `require_or_load'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:336:in `depend_on'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:252:in `require_dependency'
    from /app/vendor/bundle/ruby/2.4.0/gems/railties-5.0.1/lib/rails/engine.rb:476:in `block (2 levels) in eager_load!'
    from /app/vendor/bundle/ruby/2.4.0/gems/railties-5.0.1/lib/rails/engine.rb:475:in `each'
    from /app/vendor/bundle/ruby/2.4.0/gems/railties-5.0.1/lib/rails/engine.rb:475:in `block in eager_load!'
    from /app/vendor/bundle/ruby/2.4.0/gems/railties-5.0.1/lib/rails/engine.rb:473:in `each'
    from /app/vendor/bundle/ruby/2.4.0/gems/railties-5.0.1/lib/rails/engine.rb:473:in `eager_load!'
    from /app/vendor/bundle/ruby/2.4.0/gems/railties-5.0.1/lib/rails/engine.rb:354:in `eager_load!'
    from /app/vendor/bundle/ruby/2.4.0/gems/railties-5.0.1/lib/rails/application/finisher.rb:59:in `each'
    from /app/vendor/bundle/ruby/2.4.0/gems/railties-5.0.1/lib/rails/application/finisher.rb:59:in `block in <module:Finisher>'
    from /app/vendor/bundle/ruby/2.4.0/gems/railties-5.0.1/lib/rails/initializable.rb:30:in `instance_exec'
    from /app/vendor/bundle/ruby/2.4.0/gems/railties-5.0.1/lib/rails/initializable.rb:30:in `run'
    from /app/vendor/bundle/ruby/2.4.0/gems/railties-5.0.1/lib/rails/initializable.rb:55:in `block in run_initializers'
    from /app/vendor/ruby-2.4.0/lib/ruby/2.4.0/tsort.rb:228:in `block in tsort_each'
    from /app/vendor/ruby-2.4.0/lib/ruby/2.4.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component'
    from /app/vendor/ruby-2.4.0/lib/ruby/2.4.0/tsort.rb:431:in `each_strongly_connected_component_from'
    from /app/vendor/ruby-2.4.0/lib/ruby/2.4.0/tsort.rb:349:in `block in each_strongly_connected_component'
    from /app/vendor/ruby-2.4.0/lib/ruby/2.4.0/tsort.rb:347:in `each'
    from /app/vendor/ruby-2.4.0/lib/ruby/2.4.0/tsort.rb:347:in `call'
    from /app/vendor/ruby-2.4.0/lib/ruby/2.4.0/tsort.rb:347:in `each_strongly_connected_component'
    from /app/vendor/ruby-2.4.0/lib/ruby/2.4.0/tsort.rb:226:in `tsort_each'
    from /app/vendor/ruby-2.4.0/lib/ruby/2.4.0/tsort.rb:205:in `tsort_each'
    from /app/vendor/bundle/ruby/2.4.0/gems/railties-5.0.1/lib/rails/initializable.rb:54:in `run_initializers'
    from /app/vendor/bundle/ruby/2.4.0/gems/railties-5.0.1/lib/rails/application.rb:352:in `initialize!'
    from /app/config/environment.rb:5:in `<top (required)>'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:293:in `require'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:293:in `block in require'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:259:in `load_dependency'
    from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:293:in `require'
    from /app/vendor/bundle/ruby/2.4.0/gems/railties-5.0.1/lib/rails/application.rb:328:in `require_environment!'
    from /app/vendor/bundle/ruby/2.4.0/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:157:in `require_application_and_environment!'
    from /app/vendor/bundle/ruby/2.4.0/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:77:in `console'
    from /app/vendor/bundle/ruby/2.4.0/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:49:in `run_command!'
    from /app/vendor/bundle/ruby/2.4.0/gems/railties-5.0.1/lib/rails/commands.rb:18:in `<top (required)>'
    from /app/bin/rails:9:in `require'
    from /app/bin/rails:9:in `<main>'

Thanks!

like image 988
John Allen Avatar asked Jan 28 '17 02:01

John Allen


2 Answers

The problem comes from this line in your test environment section:

<%= Rails.application.secrets[:database][:password] %>

When Rails boots up, it loads config/database.yml and parse the whole file with the ERB gem before YAML.load. So every erb code will be executed no matter which environment you are running. When the ERB parser comes to the above line, it tries to reads the value of :password from Rails.application.secrets[:database]. When there's no :database section under the corresponding environment key, Rails.application.secrets[:database] becomes nil and calling [:password] on it gives you the error

undefined method `[]' for nil:NilClass

You can add database: under each environment key in config/secrets.yml to fix this problem. Or replace the nested secrets[:database][:password] structure with a flat structure secrets[:database_password]. Or remove the line which is causing the problem.

You can check the database_configuration method in /railties-5.1.4/lib/rails/application/configuration.rb for more detail.

like image 83
Wen Avatar answered Oct 05 '22 20:10

Wen


When dealing with the YAML file format, indentation matters. You have a few different indentation levels going on.

Also, it looks like you're missing a key for the "test" environment.

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  socket: /tmp/mysql.sock
  reconnect: true

development:
  <<: *default
  database: hittrax_tournaments_development
  username: root
  password: <%= ENV['DB_PASSWORD'] %>

test:
  <<: *default
  database: hittrax_tournaments_test
  username: root
  password: <%= Rails.application.secrets[:database][:password] %>

production:
  database: <%= ENV['DATABASE'] %>
  username: <%= ENV['USERNAME'] %>
  password: <%= ENV['PASSWORD'] %>
  host: <%= ENV['HOST'] %>
  port: 3306

Also, for reference, here's what I get when running rails new hittrax -d mysql:

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password:
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: hittrax_development

test:
  <<: *default
  database: hittrax_test

production:
  <<: *default
  database: hittrax_production
  username: hittrax
  password: <%= ENV['HITTRAX_DATABASE_PASSWORD'] %>
like image 44
Richard Avatar answered Oct 05 '22 19:10

Richard