Rails.env vs RAILS_ENV
在查看运行的env时,我在两个例子中看到了什么?首选项是什么? 他们是为了所有的意图和目的是平等的吗?
根据文档 , #Rails.env
包装RAILS_ENV
:
# File vendor/rails/railties/lib/initializer.rb, line 55 def env @_env ||= ActiveSupport::StringInquirer.new(RAILS_ENV) end
但是,使用ActiveSupport::StringInquirer
来具体了解它是如何打包的:
在这个类中包装一个string给你一个更漂亮的方式来testing相等性。 Rails.env返回的值包装在一个StringInquirer对象中,而不是调用它:
Rails.env == "production"
你可以调用这个:
Rails.env.production?
所以他们不完全相同 ,但他们相当接近。 我还没有使用过Rails,但是我会说#Rails.env
由于使用了StringInquirer
而成为更具视觉吸引力的选项。
在Rails 2.x之前,获取当前环境的首选方法是使用RAILS_ENV
常量。 同样,您可以使用RAILS_DEFAULT_LOGGER
获取当前logging器或RAILS_ROOT
以获取到根文件夹的path。
从Rails 2.x开始,Rails通过一些特殊的方法引入了Rails
模块:
- Rails.root
- Rails.env
- Rails.logger
这不仅仅是一个表面上的变化。 Rails模块提供了使用标准常量(如StringInquirer
支持)所不具备的function。 也有一些细微的差别。 Rails.root
不返回一个简单的String
buth一个Path
实例。
无论如何,首选的方法是使用Rails
模块。 常量在Rails 3中不推荐使用,在将来的版本中可能会被删除,也许Rails 3.1。
ENV['RAILS_ENV']
现在已被弃用 。
你应该使用Rails.env
显然更好。
更新:在Rails 3.0.9中:在railties / lib / rails.rb中定义的env方法
奇怪的行为,同时debugging我的应用程序:需要“active_support /通知”(rdb:1)p ENV ['RAILS_ENV']“test”(rdb:1)p Rails.env“开发”
我会说,你应该坚持一个或另一个(最好是Rails.env)