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)
在新的 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 分段为环境,但没有用于开发/测试环境的这些节点。
| 归档时间: |
|
| 查看次数: |
6061 次 |
| 最近记录: |