Rails.env和RAILS_ENV


219

在检查正在运行的环境时,我在示例中都看到了这两种情况。首选什么?就所有意图和目的而言,它们是否相等?

Answers:


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


很好的解释,谢谢!我还试图找到RAILS_ENV的定义位置?任何想法??
brad 2010年

70
值得一提的Rails.env是,该标准RAILS_ENV已被弃用。
Ryan Bigg

4
Ryan,在命令行上,您不能使用Rails.env。因此,如果即将淘汰,那么您将在CLI上使用什么?
pjammer 2011年

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不会返回简单StringPath实例。

无论如何,首选方式是使用Rails模块。在Rails 3中不推荐使用常量,并且在将来的版本(可能是Rails 3.1)中将删除常量。


1
仅供参考,从这里讨论的内容来看,听起来这些方法是在Rails 2.3而不是2.0中引入的。
jrdioko 2010年

我们在一个项目上使用2.1.2。 Rails.env可以正常工作。
本杰明·奥克斯

2

调试我的应用程序时出现奇怪的行为:要求“ active_support / notifications”(rdb:1)p ENV ['RAILS_ENV']“ test”(rdb:1)p Rails.env“ development”

我会说你应该坚持一个或另一个(最好是Rails.env)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.