Rails.env vs RAILS_ENV

219

Widzę oba przykłady w sprawdzaniu, w której env działa. Co jest preferowane? Czy pod każdym względem są one równe?

ćwiek
źródło

Odpowiedzi:

370

Według dokumentów , #Rails.envotacza RAILS_ENV:

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

Ale spójrz dokładnie na to, jak jest owinięty, używając ActiveSupport::StringInquirer:

Zawijanie łańcucha w tej klasie daje ładniejszy sposób na sprawdzenie równości. Wartość zwrócona przez Rails.env jest zawinięta w obiekt StringInquirer, więc zamiast wywoływać to:

Rails.env == "production"

możesz to nazwać:

Rails.env.production?

Więc nie są dokładnie równoważne, ale są dość blisko. Jeszcze nie korzystałem z Railsów, ale powiedziałbym, że #Rails.envjest to z pewnością bardziej atrakcyjna wizualnie opcja ze względu na użycie StringInquirer.

Mark Rushakoff
źródło
ładne wyjaśnienie, dzięki! Próbuję również znaleźć, gdzie zdefiniowano RAILS_ENV? Dowolny pomysł??
Brad
70
Warto wspomnieć, że Rails.envjest to nowy standard, ponieważ RAILS_ENVjest przestarzały.
Ryan Bigg,
4
Ryan, w wierszu poleceń nie możesz używać Rails.env. więc jeśli wkrótce będzie przestarzałe, to czego użyłbyś w CLI?
pjammer
8
Korzystasz z produktu Rails.env.? zabezpiecza Cię przed literówkami zmieniającymi środowisko w następujący sposób: RAILS_ENV = "production". Zwróć uwagę na brakujący znak
Magne,
Cała ta absurdalna złożoność tylko po to, by użyć znaku zapytania?
Wyrzuć konto
31

ENV['RAILS_ENV']jest teraz przestarzała .

Powinieneś używać tego, Rails.envco jest wyraźnie o wiele ładniejsze.

superluminarny
źródło
29

Przed Railsami 2.x preferowanym sposobem na uzyskanie bieżącego środowiska było użycie RAILS_ENVstałej. Podobnie możesz użyć, RAILS_DEFAULT_LOGGERaby uzyskać bieżący program rejestrujący lub RAILS_ROOTuzyskać ścieżkę do folderu głównego.

Począwszy od Rails 2.x, Rails wprowadził Railsmoduł za pomocą specjalnych metod:

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

To nie jest tylko zmiana kosmetyczna. Moduł Rails oferuje funkcje niedostępne przy użyciu standardowych stałych, takich jak StringInquirerwsparcie. Istnieją również niewielkie różnice. Rails.rootnie zwraca prostej Stringbuth Pathinstancji.

W każdym razie preferowanym sposobem jest użycie Railsmodułu. Stałe są nieaktualne w Rails 3 i zostaną usunięte w przyszłym wydaniu, być może Rails 3.1.

Simone Carletti
źródło
1
Do waszej informacji, z tego, co tu omówiono , wygląda na to, że metody te zostały wprowadzone w Rails 2.3, a nie 2.0.
jrdioko,
Używamy 2.1.2 w projekcie. Rails.envdziała bez problemu.
Benjamin Oakes
2

Dziwne zachowanie podczas debugowania mojej aplikacji: wymagaj „active_support / notifications” (rdb: 1) p ENV [„RAILS_ENV”] „test” (rdb: 1) p Rails.env „development”

Powiedziałbym, że powinieneś trzymać się jednego lub drugiego (a najlepiej Rails.env)

JuYo
źródło
2

Aktualizacja: w Rails 3.0.9: metoda env zdefiniowana w pliku railties / lib / rails.rb

jgpawletko
źródło