Rails.envとRAILS_ENV


219

どちらの環境で実行されているかを確認するときに、例に両方が表示されます。それらは、すべての意図と目的のために等しいですか?

回答:


370

ドキュメントよると#Rails.envラップRAILS_ENV

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

しかし、具体的にどのようにラップされているかを見てみましょうActiveSupport::StringInquirer

このクラスで文字列をラップすると、等価性をテストするためのよりきれいな方法が得られます。Rails.envによって返された値はStringInquirerオブジェクトにラップされているため、これを呼び出す代わりに:

Rails.env == "production"

あなたはこれを呼び出すことができます:

Rails.env.production?

したがって、それらは完全に同等ではありませんが、かなり近いです。まだRailsをあまり使用していませんが、を使用する#Rails.envことで、視覚的に魅力的なオプションが確かにあると思いますStringInquirer


いい説明、thx!また、RAILS_ENVが定義されている場所を見つけようとしていますか?何か案が??
ブラッド、

70
これRails.envは、RAILS_ENV廃止予定の新しい標準であることを言及する価値があります。
ライアンビッグ

4
ライアン、コマンドラインではRails.envを使用できません。それで、もうすぐ廃止される場合は、CLIで何を使用しますか?
pjammer

8
Rails.env.productionを使用していますか?次のように実際に環境を変更するタイプミスから保護します:RAILS_ENV = "production"。欠落した=記号に注意してください。
Magne、

このすべてのばかげた複雑さは、疑問符を使用できるようにするためですか?
アカウントを捨てる

31

ENV['RAILS_ENV']非推奨になりました

あなたRails.envは明らかにはるかに良い方を使うべきです。


29

Rails 2.xより前は、現在の環境を取得するための推奨される方法はRAILS_ENV定数を使用することでした。同様に、を使用RAILS_DEFAULT_LOGGERして現在のロガーRAILS_ROOTを取得したり、ルートフォルダーへのパスを取得したりできます。

Rails 2.xから、Rails Railsはいくつかの特別なメソッドを備えたモジュールを導入しました:

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

これは単なる表面的な変更ではありません。Railsモジュールは、StringInquirerサポートなどの標準定数を使用して利用できない機能を提供します。若干の違いもあります。Rails.root単純なStringbuthのPathインスタンスを返しません。

とにかく、推奨される方法はRailsモジュールを使用することです。定数はRails 3では非推奨であり、将来のリリース、おそらくRails 3.1で削除される予定です。


1
参考までに、ここで説明したことから、これらのメソッドは2.0ではなくRails 2.3で導入されたようです。
jrdioko、

プロジェクトでは2.1.2を使用しています。 Rails.env問題なく動作します。
ベンジャミンオークス2011年

2

アプリのデバッグ中の奇妙な動作:require "active_support / notifications"(rdb:1)p ENV ['RAILS_ENV'] "test"(rdb:1)p Rails.env "development"

私はあなたがどちらかに固執するべきだと言うでしょう(そしてできればRails.env)


2

更新:Rails 3.0.9の場合:railties / lib / rails.rbで定義されたenvメソッド

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.