Rails.env vs RAILS_ENV

219

Vejo os dois exemplos ao verificar em que ambiente estamos executando. O que é preferido? Eles são, para todos os efeitos, iguais?

Brad
fonte

Respostas:

370

De acordo com os documentos , os #Rails.envembrulhos RAILS_ENV:

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

Porém, observe especificamente como ele está envolvido, usando ActiveSupport::StringInquirer:

O agrupamento de uma sequência nesta classe fornece uma maneira mais bonita de testar a igualdade. O valor retornado pelo Rails.env é agrupado em um objeto StringInquirer, portanto, em vez de chamar isso:

Rails.env == "production"

você pode chamar isso:

Rails.env.production?

Portanto, eles não são exatamente equivalentes, mas são bastante próximos. Ainda não usei muito o Rails, mas eu diria que #Rails.envé certamente a opção mais atraente visualmente devido ao uso StringInquirer.

Mark Rushakoff
fonte
boa explicação, thx! Também estou tentando encontrar onde RAILS_ENV está definido? Qualquer ideia??
26710 brad
70
Vale ressaltar que esse Rails.envé o novo padrão que RAILS_ENVestá sendo descontinuado.
Ryan Bigg
4
Ryan, em uma linha de comando, você não pode usar o Rails.env. então, se for preterido em breve, o que você usaria na CLI?
pjammer
8
Usando Rails.env.production? protege você contra erros de digitação que realmente alteram o ambiente como este: RAILS_ENV = "produção". Observe o sinal de falta =.
Magne
Toda essa complexidade ridícula só para você poder usar um ponto de interrogação?
Jogue fora a conta
31

ENV['RAILS_ENV']agora está obsoleto .

Você deve usar o Rails.envque é claramente muito melhor.

superluminário
fonte
29

Antes do Rails 2.x, a maneira preferida de obter o ambiente atual era usar a RAILS_ENVconstante. Da mesma forma, você pode usar RAILS_DEFAULT_LOGGERpara obter o criador de logs atual ou RAILS_ROOTo caminho para a pasta raiz.

A partir do Rails 2.x, o Rails apresentou o Railsmódulo com alguns métodos especiais:

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

Esta não é apenas uma mudança cosmética. O módulo Rails oferece recursos não disponíveis usando as constantes padrão, como StringInquirersuporte. Existem também algumas pequenas diferenças. Rails.rootnão retorna um Stringbuth simples por Pathinstância.

De qualquer forma, a maneira preferida é usar o Railsmódulo. As constantes foram descontinuadas no Rails 3 e serão removidas em uma versão futura, talvez o Rails 3.1.

Simone Carletti
fonte
1
Para sua informação, do que foi discutido aqui , parece que esses métodos foram introduzidos no Rails 2.3, não no 2.0.
Jrdioko
Estamos usando o 2.1.2 em um projeto. Rails.envfunciona sem problemas.
Benjamin Oakes
2

Comportamento estranho ao depurar meu aplicativo: requer "suporte_ ativo / notificações" (rdb: 1) p ENV ['RAILS_ENV'] "teste" (rdb: 1) p Rails.env "development"

Eu diria que você deve seguir um ou outro (e de preferência o Rails.env)

JuYo
fonte
2

Atualização: no Rails 3.0.9: método env definido em railties / lib / rails.rb

jgpawletko
fonte