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!
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.
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'] %>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With