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.


приємне пояснення, THX! Я також намагаюся знайти, де визначено RAILS_ENV? Будь-яка ідея ??
бред

70
Варто згадати, що Rails.envце новий стандарт, RAILS_ENVякий застарілий.
Райан Бігг

4
Раян, у командному рядку ви не можете використовувати Rails.env. тож якщо це скоро застаріле, то що б ви використовували в CLI?
pjammer

8
Використання Rails.env.production? захищає вас від помилок, які насправді змінюють середовище так: RAILS_ENV = "виробництво". Помітьте пропущений = знак.
Магне

Вся ця смішна складність лише для того, щоб ви могли використовувати знак питання?
Викиньте рахунок

31

ENV['RAILS_ENV']зараз застаріло .

Вам слід використовувати те, Rails.envщо явно набагато приємніше.


29

Перед Rails 2.x кращим способом отримання поточного середовища було використання RAILS_ENVконстанти. Аналогічно, ви можете використовувати RAILS_DEFAULT_LOGGERдля отримання поточного реєстратора або RAILS_ROOTотримання шляху до кореневої папки.

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

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

Це не просто косметична зміна. Модуль Rails пропонує можливості, недоступні за допомогою стандартних констант, таких як StringInquirerпідтримка. Також є деякі незначні відмінності. Rails.rootне повертає простий Stringбут Pathекземпляр.

У будь-якому випадку кращим способом є використання Railsмодуля. Константи застаріли в Rails 3 і будуть видалені в майбутньому випуску, можливо, Rails 3.1.


1
FYI, з того, що тут обговорювалося , здається, що ці методи були введені в 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)


2

Оновлення: в Rails 3.0.9: метод env, визначений у railties / lib / rails.rb

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.