Rails.env vs RAILS_ENV

219

Veo ambos en ejemplos cuando compruebo en qué entorno se está ejecutando. ¿Qué se prefiere? ¿Son iguales, a todos los efectos?

puntilla
fuente

Respuestas:

370

Según los documentos , se #Rails.envenvuelve RAILS_ENV:

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

Pero, mire específicamente cómo está envuelto, usando ActiveSupport::StringInquirer:

Ajustar una cadena en esta clase le brinda una forma más bonita de probar la igualdad. El valor devuelto por Rails.env está envuelto en un objeto StringInquirer, por lo que en lugar de llamar a esto:

Rails.env == "production"

puedes llamar a esto:

Rails.env.production?

Por lo tanto, no son exactamente equivalentes, pero están bastante cerca. Todavía no he usado mucho Rails, pero diría que #Rails.enves sin duda la opción más atractiva visualmente debido al uso StringInquirer.

Mark Rushakoff
fuente
Buena explicación, gracias! También estoy tratando de encontrar dónde se define RAILS_ENV? ¿¿Alguna idea??
Brad
70
Vale la pena mencionar que Rails.enves el nuevo estándar, ya que RAILS_ENVestá en desuso.
Ryan Bigg el
44
Ryan, en una línea de comando, no puedes usar Rails.env. entonces, si se está desaprobando pronto, ¿qué usaría en la CLI?
pjammer
8
Usando Rails.env.production? lo protege contra errores tipográficos que realmente cambian el entorno de esta manera: RAILS_ENV = "producción". Observe el signo perdido =.
Magne
¿Toda esta complejidad ridícula solo para que puedas usar un signo de interrogación?
Deseche la cuenta
31

ENV['RAILS_ENV']ahora está en desuso .

Deberías usar el Rails.envque claramente es mucho mejor.

superluminario
fuente
29

Antes de Rails 2.x, la forma preferida de obtener el entorno actual era usar la RAILS_ENVconstante. Del mismo modo, puede usar RAILS_DEFAULT_LOGGERpara obtener el registrador actual o RAILS_ROOTpara obtener la ruta a la carpeta raíz.

A partir de Rails 2.x, Rails introdujo el Railsmódulo con algunos métodos especiales:

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

Esto no es solo un cambio cosmético. El módulo Rails ofrece capacidades que no están disponibles utilizando las constantes estándar, como el StringInquirersoporte. También hay algunas pequeñas diferencias. Rails.rootno devuelve un simple Stringpero unPath instancia.

De todos modos, la forma preferida es usar el Railsmódulo. Las constantes están en desuso en Rails 3 y se eliminarán en una versión futura, tal vez Rails 3.1.

Simone Carletti
fuente
1
Para su información, por lo que se discutió aquí , parece que esos métodos se introdujeron en Rails 2.3, no 2.0.
jrdioko
Estamos usando 2.1.2 en un proyecto. Rails.envFunciona sin problemas.
Benjamin Oakes
2

Comportamiento extraño al depurar mi aplicación: requiere "active_support / notifications" (rdb: 1) p ENV ['RAILS_ENV'] "test" (rdb: 1) p Rails.env "development"

Yo diría que debes apegarte a uno u otro (y preferiblemente a Rails.env)

JuYo
fuente
2

Actualización: en Rails 3.0.9: método env definido en railties / lib / rails.rb

jgpawletko
fuente