纠正Ruby on Rails 3取代ENV || =’生产’?

我们正在升级到Ruby on Rails 3(现在就像世界的一半),我一直在努力取代RAILS_ENV的用法,例如

RAILS_ENV == 'wibble' # becomes Rails.env.wibble? 

但我不确定如何处理:

 ENV["RAILS_ENV"] ||= 'production' 

我们已将它放在一大堆Rake任务和守护进程的顶部,并且想法是你可以在命令行上传递RAILS_ENV ,但是如果它没有通过则默认为’production’。

我不确定新的Rails3适合的方式。 所以现在我的rails:upgrade:check正在抱怨Rails2-ishness的这种入侵…

我不知道是否:

 ::Rails.env ||= 'production' 

将工作。

Rails.env是否存在于守护进程中?

它是否自动获得预先填充在命令行上传递的RAILS_ENV的值,还是需要一种新的方式来调用守护进程?

对此有什么正确的口头禅?


更新:

查看Rails.env的源代码,

 def env @_env ||= ActiveSupport::StringInquirer.new(RAILS_ENV) end 

我们可以推断出一些东西。

首先,看起来RAILS_ENV确实仍然存在 – 这意味着它可以设置并且Rails.env会找到它……

如果Rails在守护进程的上下文中有效,则不需要再进行任何操作。 如果没有 – 那么我可能不在乎并像以前一样使用旧的RAILS_ENV

Rails.env实际上是ActiveSupport::StringInquirer类型,它覆盖method_missing以提供良好的相等语法。 检查: http : //api.rubyonrails.org/classes/ActiveSupport/StringInquirer.html

所以,如果你想通过defaut将它覆盖为“生产”,你应该写:

 Rails.env ||= ActiveSupport::StringInquirer.new('production') 

但是,您必须检查哪个是Rails.env的未初始化值,我不确定它是否真的nil

IMO的最佳行动方案是将env RAILS_ENV=production到您的所有脚本中。

编辑lib/tasks/environments.rake

 # Sets environments as needed for rake tasks %w[development production staging].each do |env| desc "Runs the following task in the #{env} environment" task env do Rails.env = env end end task :testing do Rake::Task["test"].invoke end task :dev do Rake::Task["development"].invoke end task :prod do Rake::Task["production"].invoke end 

资源

UPDATE

通过命令行传递 RAILS_ENV=production ,如下所示:

RAILS_ENV=production rake db:setup

这有用吗:

 # before if RAILS_ENV == 'production' ... # Rails 3 if Rails.env.production? 
 if Rails.env.production? puts '...'