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?

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.


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.


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.


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)


2

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.