我们正在升级到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
。
答案 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
<强>更新强>
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 '...'