2015-02-24 8 views
5

Ich habe mein database.yml geändert, um sqlite3-Datenbank in Test und Entwicklung und postgresql in der Produktion zu verwenden. Meine Anwendung in der Produktion gut laufen, aber wenn ich starten Test- oder Entwicklungs environements ich habe diesen Fehler:kann 'rails.application.database_configuration' undefinierte Methode '[]' für nil nicht laden: NilClass

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

mein 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]%> 

Antwort

-3
host: <%= Rails.application.secrets[:database][:host]%> 
database: <%= Rails.application.secrets[:database][:name]%> 
username: <%= Rails.application.secrets[:database][:username]%> 
password: <%= Rails.application.secrets[:database][:password]%> 

Oh Herr, tu das nicht. Tun Sie das nicht aus vielen Gründen.

Verwenden ENV Vars auf dem Produktionsserver statt:

host: <%= ENV['DB_HOST'] %> 
database: <%= ENV['DB_NAME'] %> 
username: <%= ENV['DB_USER'] %> 
password: <%= ENV['DB_PASSEWORD'] %> 

Dann möchten Sie auf Ihren prod Server gehen und diese Variablen in der Shell-Konfigurationsdatei festgelegt (Bashrc, .zshrc, .profile) wie folgt :

export DB_HOST=your_host 
export DB_NAME=your_name 
export DB_USER=your_user 
export DB_PASSWORD=your_password 

Ihr Problem ist 1 von 2 möglichen Dinge:

a. Eine Race-Bedingung, bei der die Datenbankkonfigurationen vor der Secrets-Datei geladen werden.

b. Sie haben Ihre Geheimnisse. Sie sind segmentiert Umgebungen und haben diese Knoten nicht für Entwicklungs-/Testumgebungen.

+0

dankt mir in den guten Schienen zu setzen, war die Ursache der fehlenden Knoten in secrets.yml – scauglog

+2

so .. es kocht für 'development' einen' database' Abschnitt zum Hinzufügen nach unten und 'test' Umgebungen in' secrets.yml'. Recht? –

+0

Ich benutze 'ENV' Variablen für die Datenbankverbindung und ich habe meine Einstellungen in' secrets.yml' gespeichert .. aber wenn 'rails s' ausgeführt werden und ich versuche auf die Rails App zuzugreifen bekomme ich den Fehler' Access denied for user 'root' @ 'localhost' (mit Passwort: NEIN) '.. Irgendwelche Ideen? – Lykos

1

Neben Informationen zum Sicherheits

Wenn Sie diesen Weg gehen, gehen, was in Ordnung ist, müssen Sie sicher eine sehr wichtige Sache machen:

Ihre secrets.yml Datei sicher bereitgestellt wird , nicht in die Quellcodeverwaltung überprüft und nicht lesbar jeder, der Zugang nicht fo

In diesem Fall ist es nicht weniger sicher als mit einem Locked-Down *key/*crt Zertifikatsdatei haben sollte r Ihren Webserver, außer dass Sie möglicherweise mehrere Geheimnisse speichern. richtig zu tun ist vorzuziehen, Geheimnisse in ENV zu setzen, aber es gibt noch bessere Möglichkeiten.

Einige weitere Lektüre:

Ihr tatsächliches Problem

Ihr Problem @ tagCincy zweite Idee ist ("b "), und seltsam genug, das ist super einfach zu beheben. Mach einfach was @ Nik-Olai vorgeschlagen.Erklären (wenn auch leere) Werte der gleichen Parameter in Ihrem dev/Testumgebungen wie folgt aus:

development: 
    ... 
    database: 
    :name: 
    :username: 
    :password: 

test: 
    # same thing here 

Der Grund dafür ist, dass, während die production Datenbank-Konfiguration erhalten in development oder test Umgebungen nicht verwendet, Parsing dieser Konfiguration wird immer noch passieren.

Anders ausgedrückt, Ihre Produktionsdatenbankeinstellungen werden auch im Test/Entwicklungsmodus noch geparst (und ERB-interpretiert).

Rails.application.secrets ist umgebungsabhängig, so in dev und Prüfphasen Rails.application.secrets[:database] nicht existieren, was bedeutet, dass der nachfolgende [] Anruf ein Null Ziel getroffen wird, und voila!

1

Ran in dies mit dem neuen Rails 5.1.0 mit dem Hinzufügen meiner Variablen in der neuen geheimen verschlüsselten Datei.

Ihr Nil passiert, denn obwohl es Entwicklung ist, versucht es immer noch, alles zu laden, und Sie rufen Dinge von Null -> etwas [: nil] [: cant_grab_from_nil]. Die schnelle Problemumgehung ist eine if-Anweisung. Schlagen Sie dies nur vor, wenn Sie die verschlüsselte Datei in den neuen Rails 5.1 verwenden.

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 %> 
Verwandte Themen