纠正Ruby on Rails 3取代ENV [“RAILS_ENV”] || ='生产'?

时间:2010-10-25 17:11:43

标签: ruby-on-rails ruby-on-rails-3

我们正在升级到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

3 个答案:

答案 0 :(得分:11)

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添加到您的所有脚本中。

答案 1 :(得分:9)

修改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

Source

<强>更新

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

RAILS_ENV=production rake db:setup

this是否有帮助:

# before
if RAILS_ENV == 'production'
  ...

# Rails 3
if Rails.env.production?

答案 2 :(得分:2)

if Rails.env.production?
  puts '...'