Rails.env与RAILS_ENV

bra*_*rad 211 ruby-on-rails

我在示例中看到了两个运行中的env的情况.什么是首选?出于所有意图和目的,它们是否相同?

Mar*_*off 360

根据文档,#Rails.env包装RAILS_ENV:

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

但是,具体看看它是如何包装的,使用ActiveSupport::StringInquirer:

在此类中包装字符串为您提供了一种更好的方法来测试相等性.Rails.env返回的值包含在StringInquirer对象中,因此不是调用它:

Rails.env == "production"
Run Code Online (Sandbox Code Playgroud)

你可以这样称呼:

Rails.env.production?
Run Code Online (Sandbox Code Playgroud)

所以它们并不完全相同,但它们相当接近.我还没有使用Rails,但我认为#Rails.env由于使用它肯定是更具视觉吸引力的选择StringInquirer.

  • 值得一提的是,`Rails.env`是新标准,因为`RAILS_ENV`已被弃用. (70认同)
  • 使用Rails.env.production?保护您免受错误实际改变环境的错误:RAILS_ENV ="production".注意错过的=符号. (8认同)
  • Ryan,在命令行上,你不能使用Rails.env.所以如果它很快就会弃用,那么你会在CLI上使用什么? (4认同)

Sim*_*tti 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.


sup*_*ary 29

ENV['RAILS_ENV']现已弃用.

你应该使用Rails.env哪个明显更好.