Rails.env vs RAILS_ENV


219

Vedo entrambi negli esempi quando controllo in quale ambiente si sta eseguendo. Qual è la scelta preferita? Sono uguali a tutti gli effetti?

Risposte:


370

Secondo i documenti , #Rails.envavvolge RAILS_ENV:

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

Ma guarda nello specifico come è avvolto, usando ActiveSupport::StringInquirer:

Avvolgere una stringa in questa classe ti offre un modo più carino per verificare l'uguaglianza. Il valore restituito da Rails.env è racchiuso in un oggetto StringInquirer, quindi invece di chiamarlo:

Rails.env == "production"

puoi chiamare questo:

Rails.env.production?

Quindi non sono esattamente equivalenti, ma sono abbastanza vicini. Non ho ancora usato Rails, ma direi che #Rails.envè sicuramente l'opzione più visivamente attraente grazie all'utilizzo StringInquirer.


bella spiegazione, grazie! Sto anche cercando di trovare dove è definito RAILS_ENV? Qualche idea??
Brad

70
Vale la pena ricordare che Rails.envè il nuovo standard in quanto RAILS_ENVè deprecato.
Ryan Bigg,

4
Ryan, da una riga di comando, non puoi usare Rails.env. quindi se presto si deprecherà, cosa useresti nella CLI?
Pjammer,

8
Usando Rails.env.production? ti protegge dai refusi cambiando effettivamente l'ambiente in questo modo: RAILS_ENV = "produzione". Notare il segno mancato =.
Magne,

Tutta questa ridicola complessità solo per poter usare un punto interrogativo?
Getta via l'account

31

ENV['RAILS_ENV']è ora obsoleto .

Dovresti usare il Rails.envche è chiaramente molto più bello.


29

Prima di Rails 2.x il modo preferito per ottenere l'ambiente corrente era usare la RAILS_ENVcostante. Allo stesso modo, è possibile utilizzare RAILS_DEFAULT_LOGGERper ottenere il logger corrente o RAILS_ROOTper ottenere il percorso della cartella principale.

A partire da Rails 2.x, Rails ha introdotto il Railsmodulo con alcuni metodi speciali:

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

Questo non è solo un cambiamento estetico. Il modulo Rails offre funzionalità non disponibili utilizzando le costanti standard come il StringInquirersupporto. Ci sono anche alcune lievi differenze. Rails.rootnon restituisce un semplice Stringbuth Pathun'istanza.

Ad ogni modo, il modo preferito è usare il Railsmodulo. Le costanti sono deprecate in Rails 3 e verranno rimosse in una versione futura, forse Rails 3.1.


1
Cordiali saluti, da quanto discusso qui , sembra che quei metodi siano stati introdotti in Rails 2.3, non 2.0.
jrdioko,

Stiamo usando 2.1.2 su un progetto. Rails.envfunziona senza problemi.
Benjamin Oakes,

2

Comportamento strano durante il debug della mia app: richiede "supporto_attivo / notifiche" (rdb: 1) p ENV ['RAILS_ENV'] "test" (rdb: 1) p "sviluppo" di Rails.env

Direi che dovresti attenersi l'uno o l'altro (e preferibilmente Rails.env)


2

Aggiornamento: in Rails 3.0.9: metodo env definito in railties / lib / rails.rb

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.