无法为nil:NilClass加载'rails.application.database_configuration'未定义的方法'[]'

sca*_*log 5 ruby-on-rails ruby-on-rails-4

我改变了我的database.yml,在测试和开发中使用sqlite3数据库,在生产中使用postgresql.我的应用程序在生产中运行良好,但是当我启动测试或开发环境时,我有这样的错误:

Cannot load 'Rails.application.database_configuration':
undefined method'[]' for nil:NilClass (NoMethoError)
Run Code Online (Sandbox Code Playgroud)

我的database.yml:

# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: sqlite3
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: db/test.sqlite3

production:
  pool: 5
  timeout: 5000
  encoding: utf8
  adapter: postgresql
  host: <%= Rails.application.secrets[:database][:host]%>
  database: <%= Rails.application.secrets[:database][:name]%>
  username: <%= Rails.application.secrets[:database][:username]%>
  password: <%= Rails.application.secrets[:database][:password]%>
Run Code Online (Sandbox Code Playgroud)

Jak*_*ake 7

在新的 Rails 5.1.0 中遇到了这个问题,并在新的机密加密文件中添加了我的变量。

您的 nil 正在发生,因为即使它正在开发中,它仍然会尝试加载所有内容,并且您正在从 nil -> something[:nil][:cant_grab_from_nil] 调用东西。快速解决方法是使用 if 语句。只有在新的 Rails 5.1 中使用秘密加密文件时才建议这样做。

production:
  pool: 5
  timeout: 5000
  encoding: utf8
  adapter: postgresql
  <% if Rails.application.secrets[:database].present? %>
    host: <%= Rails.application.secrets[:database][:host]%>
    database: <%= Rails.application.secrets[:database][:name]%>
    username: <%= Rails.application.secrets[:database][:username]%>
    password: <%= Rails.application.secrets[:database][:password]%>
  <% end %>
Run Code Online (Sandbox Code Playgroud)


tag*_*ncy -8

host: <%= Rails.application.secrets[:database][:host]%>
database: <%= Rails.application.secrets[:database][:name]%>
username: <%= Rails.application.secrets[:database][:username]%>
password: <%= Rails.application.secrets[:database][:password]%>
Run Code Online (Sandbox Code Playgroud)

哦主啊,不要这样做。出于多种原因,不要这样做。

ENV在生产服务器上使用vars 代替:

host: <%= ENV['DB_HOST'] %>
database: <%= ENV['DB_NAME'] %>
username: <%= ENV['DB_USER'] %>
password: <%= ENV['DB_PASSEWORD'] %>
Run Code Online (Sandbox Code Playgroud)

然后,您需要进入产品服务器并在 shell 配置文件(.bashrc、.zshrc、.profile)中设置这些变量,如下所示:

export DB_HOST=your_host
export DB_NAME=your_name
export DB_USER=your_user
export DB_PASSWORD=your_password
Run Code Online (Sandbox Code Playgroud)

您的问题是以下两种可能情况之一:

A。在机密文件之前加载数据库配置的竞争条件。

b. 您将 Secrets.yml 分段为环境,但没有用于开发/测试环境的这些节点。

  • 所以......它归结为在“secrets.yml”中为“开发”和“测试”环境添加“数据库”部分。正确的? (2认同)