Исправить ошибку Ruby on Rails 3 для ENV [ "RAILS_ENV" ] || = 'production'?
Мы делаем обновление до 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, переданным в командной строке, или нам нужен новый способ вызова демонов?
Какая правильная мантра для этого?
Update:
Заглядывая в исходный код для Rails.env
,
def env
@_env ||= ActiveSupport::StringInquirer.new(RAILS_ENV)
end
мы можем вывести несколько вещей.
Во-первых, похоже, что RAILS_ENV
действительно существует, что означает, что он может быть установлен, и Rails.env
найдет его...
Если Rails действителен в контексте демона, то больше ничего не нужно делать. Если нет - тогда я мог бы просто не заботиться и использовать старый RAILS_ENV
, как и раньше.
Ответы
Ответ 1
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
ко всем вашим скриптам.
Ответ 2
Изменить 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?
Ответ 3
if Rails.env.production?
puts '...'