2010-10-25 3 views
17

Мы делаем обновление для Ruby On Rails 3 (как полмира прямо сейчас), и я усердно заменяя обычаи RAILS_ENV, напримерИсправить ошибку Ruby on Rails 3 для ENV ["RAILS_ENV"] || = 'production'?

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

Но я не так уверен что делать с:

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

Мы получили его в верхней части целой кучи Rake задач и демонов, и идея заключается в том, что вы можете передать RAILS_ENV в командной строке, но он по умолчанию " производство ", если оно не прошло.

Я не уверен в новом способе выполнения 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, как и раньше.

ответ

11

Rails.env на самом деле типа ActiveSupport::StringInquirer, который переопределяет method_missing для того, чтобы обеспечить, что хороший синтаксис равенства.Проверить: http://api.rubyonrails.org/classes/ActiveSupport/StringInquirer.html

Так что, если вы хотите заменить его «производство» по УСПЕШНОМУ, вы должны написать:

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

Однако, вам придется проверить что неинициализированное значение Rails.env, Я не уверен, что это действительно nil.

Лучший способ действий, IMO, состоит в том, чтобы просто добавить env RAILS_ENV=production ко всем вашим скриптам.

+0

Ah - теперь это полезно, Итак, «env (RAILS_ENV)» - как вы вручную устанавливаете и переменную окружения сейчас? –

+0

* g * просто заглянул в исходный код для Rails.env - теперь добавлен вопрос ... –

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

UPDATE

passRAILS_ENV=production с помощью командной строки, что-то вроде этого:

RAILS_ENV=production rake db:setup

ли this помощь:

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

# Rails 3 
if Rails.env.production? 
+0

обновляемых ........ – zengr

+0

OK, Scuse моего невежества, но: 1) как бы вы затем вызвать задачи и 2), как это повлияет на демон (в нашем случае не вызываются через грабли) , –

+0

Ох ... и просто пропустите: 3) как это решение соответствует нашему требованию «по умолчанию для производства, если в командной строке ничего не передается, но в противном случае мы можем переопределить его, если мы передадим что-то по команде линия" ? –

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

Боюсь, вы неправильно поняли требования. Я не хочу знать, действительно ли я в рабочей среде. Я хочу, чтобы мои сценарии запускались в рабочей среде по умолчанию. –

+0

Просто то, что мне нужно. – creativetechnologist

Смежные вопросы