ruby-on-rails - 无法加载 `Rails.application.database_configuration` : (NoMethodError) with launching to Heroku

标签 ruby-on-rails ruby heroku

我是一名中级 Rails 开发人员,我使用远程数据库作为生产环境中的唯一连接。我的堆栈是 Rails 5 和 Ruby 2.4.0。我已经为数据库设置了环境变量,例如 USERNAME 和 PASSWORD。当我部署到 Heroku 时,我收到此错误消息:

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

我假设这是因为 Rails 看不到环境变量,但即使我对数据库的用户名和密码进行硬编码以进行测试,也会发生相同的错误。

这是我的 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

这是堆栈跟踪

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

谢谢!

最佳答案

问题出在您的 test 环境部分中的这一行:

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

当 Rails 启动时,它加载 config/database.yml 并在 YAML.load 之前使用 ERB gem 解析整个文件。所以无论你在哪个环境运行,每一个erb代码都会被执行。当 ERB 解析器遇到上述行时,它会尝试从中读取 :password 的值 Rails.application.secrets[:database]。当相应环境键下没有:database部分时,Rails.application.secrets[:database]变为nil并调用[ :password] 给你错误

undefined method `[]' for nil:NilClass

您可以在config/secrets.yml 中的每个环境键下添加database: 来解决这个问题。或者将嵌套的 secrets[:database][:password] 结构替换为平面结构 secrets[:database_password]。或者删除导致问题的行。

您可以查看 /railties-5.1.4/lib/rails/application/configuration.rb 中的 database_configuration 方法以获取更多详细信息。

关于ruby-on-rails - 无法加载 `Rails.application.database_configuration` : (NoMethodError) with launching to Heroku,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41905756/

相关文章:

ruby-on-rails - Rails 迁移,从字符串转换为枚举

iphone - 现有网站在 iPhone 上的登录功能

ruby-on-rails - Rails 中 AMP 表单的 header 设置

ruby - 制作命令行程序 "full screen"

ruby-on-rails - Ruby on Rails - Postgres : Array value must start with "{" or dimension information

javascript - Node.js 和 Heroku

javascript - 使用 Rails 4 应用程序实现 wrapbootstrap 主题的问题

ruby-on-rails - 如何将旧提交部署到 Heroku

java - Spring:如何从 JAR 加载 "File"资源

css - 嵌入式字体呈现然后消失