Umgebungsvariablen

Die Werte für Umgebungsvariablen können für jedes System unterschiedlich definiert sein:

set
# ...
HOME=/home/christian
HOST=antigua
IRBRC=/home/christian/.rvm/rubies/ruby-2.3.0/.irbrc
# ...

Zugriff auf Umgebungsvariablen in Ruby

In Ruby können Umgebungsvariablen sehr einfach ausgelesen werden:

ENV['RUBY_VERSION'] # => "ruby-2.3.0"

Allerdings ist es auch oft notwendig, aus unterschiedlichen Gründen, Umgebungsvariablen zu setzen. Gerade in der development und test Umgebung sollten die Variablen schnell, einfach und immer vorhanden sein.
Außerdem müssen sich die Variablen je nach Umgebung oft auch unterscheiden.

Gem dotenv für Umgebungsvariablen

Es gibt mehrere Ruby Gems, die die Konfiguration der Umgebungsvariablen (auch abhängig von der Umgebung) ermöglichen.
Das Gem rails-dotenv ist das wohl Verbreiteste.
Es basiert auf .env Dateien. Zunächst erwartet es eine .env Datei mit Schlüssel-Wert-Paaren:

# .env
AWS_SECRET_ACCESS_KEY=A-very-fancy-secret-key-123
DATABASE_URL="postgres://christian@localhost/my_database"

und der Zugriff:

ENV['AWS_SECRET_ACCESS_KEY']
# => "A-very-fancy-secret-key-123"

Umgebungsabhängigge Variablen

Oft erfordern unterschiedliche Umgebungen (development, test, production) auch unterschiedliche Variablen. Dafür sollten dann Umgebungsspezifische .env Dateien angelegt werden. Die Dateinamen folgen dem Muster .env__.environment__, also z.B. .env.development oder .env.test. Alle allgemeingültigen Variablen verbleiben in der .env.
Die Dateien:

# .env
AWS_SECRET_ACCESS_KEY=A-very-fancy-secret-key-123
# .env.test
DATABASE_URL="postgres://christian@localhost/test_db"
# .env.development
DATABASE_URL="postgres://christian@localhost/development_db"

Flexible Umgebungsvariablen

Die Werte können auch relativ flexible erstellt werden. So zum Beispiel wäre es umständlich, wenn jeder Entwickler für seine Entwicklungsdatenbank erst einen neuen User anlegen müsste.
DotEnv kann mit Bash Kommandos umgehen:

# .env.development
DATABASE_URL="postgres://$(whoami)@localhost/development_db"

und der Zugriff:

ENV['DATABASE_URL']
# => "postgres://christian@localhost/my_database"

Achtung !!!

Falls andere Gems auf bestimmte Umgebungsvariablen angewiesen sind, sollte dotenv-rails vor diesen Gems in der Gemfile geladen werden.
Außerdem ist unbedingt zu beachten, dass sensible Informationen niemals in ein Versionierungssystem eingecheckt werden. Deshalb sollte DotEnv eher dazu verwendet werden um Development Systeme schnell und zuverlässig aufzusetzen. Im Produktivsystem sollten dann andere Werte verwendet werden. Auch um externe System nicht aus der development Umgebung heraus nicht zu kompromittieren.