Rails.env vs RAILS_ENV

219

Ich sehe beides in Beispielen, wenn ich überprüfe, in welcher Umgebung eine ausgeführt wird. Was wird bevorzugt? Sind sie in jeder Hinsicht gleich?

Brad
quelle

Antworten:

370

Laut den Dokumenten , #Rails.envWraps RAILS_ENV:

    # File vendor/rails/railties/lib/initializer.rb, line 55
     def env
       @_env ||= ActiveSupport::StringInquirer.new(RAILS_ENV)
     end

Schauen Sie sich jedoch genau an, wie es verpackt ist, indem Sie Folgendes verwenden ActiveSupport::StringInquirer:

Wenn Sie eine Zeichenfolge in diese Klasse einschließen, können Sie die Gleichheit besser testen. Der von Rails.env zurückgegebene Wert wird in ein StringInquirer-Objekt eingeschlossen, anstatt Folgendes aufzurufen:

Rails.env == "production"

Sie können dies nennen:

Rails.env.production?

Sie sind also nicht genau gleichwertig, aber sie stehen sich ziemlich nahe. Ich habe Rails noch nicht viel benutzt, aber ich würde sagen, dass dies #Rails.envaufgrund der Verwendung sicherlich die optisch attraktivere Option ist StringInquirer.

Mark Rushakoff
quelle
nette Erklärung, danke! Ich versuche auch herauszufinden, wo RAILS_ENV definiert ist. Irgendeine Idee??
Brad
70
Es ist erwähnenswert, dass dies Rails.envder neue Standard RAILS_ENVist, da er veraltet ist.
Ryan Bigg
4
Ryan, in einer Befehlszeile können Sie Rails.env nicht verwenden. Wenn es also bald veraltet ist, was würden Sie dann für die CLI verwenden?
pjammer
8
Verwenden Sie Rails.env.production? schützt Sie vor Tippfehlern, die die Umgebung tatsächlich wie folgt verändern: RAILS_ENV = "Produktion". Beachten Sie das verpasste = Zeichen.
Magne
All diese lächerliche Komplexität, nur damit Sie ein Fragezeichen verwenden können?
Wegwerfen Konto
31

ENV['RAILS_ENV']ist jetzt veraltet .

Sie sollten verwenden, Rails.envwas eindeutig viel schöner ist.

überleuchtet
quelle
29

Vor Rails 2.x war die Verwendung der RAILS_ENVKonstante der bevorzugte Weg, um die aktuelle Umgebung abzurufen. Ebenso können Sie RAILS_DEFAULT_LOGGERden aktuellen Logger oder RAILS_ROOTden Pfad zum Stammordner abrufen.

Ausgehend von Rails 2.x führte Rails das RailsModul mit einigen speziellen Methoden ein:

  • Rails.root
  • Rails.env
  • Rails.logger

Dies ist nicht nur eine kosmetische Veränderung. Das Rails-Modul bietet Funktionen, die mit den Standardkonstanten nicht verfügbar sind, z. B. StringInquirerUnterstützung. Es gibt auch einige geringfügige Unterschiede. Rails.rootgibt kein einfaches Stringbuth eine PathInstanz zurück.

Der bevorzugte Weg ist jedoch die Verwendung des RailsModuls. Konstanten sind in Rails 3 veraltet und werden in einer zukünftigen Version, möglicherweise Rails 3.1, entfernt.

Simone Carletti
quelle
1
Zu Ihrer Information, nach dem, was hier besprochen wurde , klingt es so, als ob diese Methoden in Rails 2.3 und nicht in 2.0 eingeführt wurden.
Jrdioko
Wir verwenden 2.1.2 für ein Projekt. Rails.envfunktioniert ohne Probleme.
Benjamin Oakes
2

Seltsames Verhalten beim Debuggen meiner App: "active_support / notifications" (rdb: 1) erforderlich p ENV ['RAILS_ENV'] "test" (rdb: 1) p Rails.env "development"

Ich würde sagen, dass Sie sich an die eine oder andere halten sollten (und vorzugsweise an Rails.env)

JuYo
quelle
2

Update: in Rails 3.0.9: env-Methode definiert in railties / lib / rails.rb

jgpawletko
quelle