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)