Rails.env против RAILS_ENV

219

Я вижу оба примера, когда проверяю, в какой среде выполняется ENV. Что предпочтительнее? Являются ли они для всех намерений и целей равными?

штифтик
источник

Ответы:

370

Согласно документации , #Rails.envобертывания RAILS_ENV:

    # File vendor/rails/railties/lib/initializer.rb, line 55
     def env
       @_env ||= ActiveSupport::StringInquirer.new(RAILS_ENV)
     end

Но посмотрите конкретно, как это обернуть, используя ActiveSupport::StringInquirer:

Обтекание строки в этом классе дает вам более красивый способ проверки на равенство. Значение, возвращаемое Rails.env, помещается в объект StringInquirer, поэтому вместо вызова этого:

Rails.env == "production"

Вы можете назвать это:

Rails.env.production?

Так что они не совсем эквивалентны, но они довольно близки. Я еще не очень много использовал Rails, но я бы сказал, что #Rails.envэто более привлекательный вариант из-за использования StringInquirer.

Марк Рушаков
источник
хорошее объяснение, спасибо! Я также пытаюсь найти, где определен RAILS_ENV? Любая идея??
Брэд
70
Стоит отметить, что Rails.envэто новый стандарт, поскольку RAILS_ENVон устарел.
Райан Бигг
4
Райан, в командной строке нельзя использовать Rails.env. так что если это скоро станет устаревшим, что бы вы использовали в CLI?
Пьяммер
8
Используете Rails.env.production? защищает вас от опечаток, фактически изменяющих среду следующим образом: RAILS_ENV = "production". Обратите внимание на пропущенный знак =.
Магне
Вся эта нелепая сложность только для того, чтобы вы могли использовать вопросительный знак?
счет
31

ENV['RAILS_ENV']сейчас устарела .

Вы должны использовать, Rails.envчто явно намного приятнее.

superluminary
источник
29

До Rails 2.x предпочтительным способом получения текущей среды было использование RAILS_ENVконстанты. Кроме того, вы можете использовать, RAILS_DEFAULT_LOGGERчтобы получить текущий регистратор или RAILS_ROOTполучить путь к корневой папке.

Начиная с Rails 2.x, Rails представил Railsмодуль с некоторыми специальными методами:

  • Rails.root
  • Rails.env
  • Rails.logger

Это не просто косметическое изменение. Модуль Rails предлагает возможности, недоступные при использовании стандартных констант, таких как StringInquirersupport. Есть также некоторые небольшие различия. Rails.rootне возвращает простой StringButh на Pathэкземпляр.

В любом случае, предпочтительным способом является использование Railsмодуля. Константы устарели в Rails 3 и будут удалены в следующем выпуске, возможно, Rails 3.1.

Симона Карлетти
источник
1
Кстати, из того, что здесь обсуждалось , похоже, что эти методы были введены в Rails 2.3, а не 2.0.
Jrdioko
Мы используем 2.1.2 в проекте. Rails.envработает без проблем.
Бенджамин Оукс
2

Странное поведение при отладке моего приложения: требуется "active_support / notifications" (rdb: 1) p ENV ['RAILS_ENV'] "test" (rdb: 1) p Rails.env "development"

Я бы сказал, что вы должны придерживаться того или иного (и желательно Rails.env)

Juyo
источник
2

Обновление: в Rails 3.0.9: метод env определен в railties / lib / rails.rb

jgpawletko
источник