Подтвердить что ты не робот

Исправить ошибку 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, как и раньше.

4b9b3361

Ответ 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 '...'