Rails.env vs RAILS_ENV

219

Saya melihat keduanya dalam contoh ketika memeriksa apakah sedang berjalan. Apa yang disukai? Apakah mereka, untuk semua maksud dan tujuan sama?

brad
sumber

Jawaban:

370

Menurut dokumen , #Rails.envmembungkus RAILS_ENV:

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

Tapi, lihat secara khusus bagaimana dibungkus, menggunakan ActiveSupport::StringInquirer:

Membungkus string di kelas ini memberi Anda cara yang lebih cantik untuk menguji kesetaraan. Nilai yang dikembalikan oleh Rails.env dibungkus dengan objek StringInquirer jadi alih-alih memanggil ini:

Rails.env == "production"

Anda dapat memanggil ini:

Rails.env.production?

Jadi mereka tidak persis setara, tetapi mereka cukup dekat. Saya belum pernah menggunakan Rails, tapi saya katakan #Rails.envtentu saja pilihan yang lebih menarik secara visual karena menggunakan StringInquirer.

Mark Rushakoff
sumber
penjelasan yang bagus, thx! Saya juga mencoba mencari di mana RAILS_ENV didefinisikan? Ada ide??
brad
70
Layak disebutkan bahwa itu Rails.envadalah standar baru RAILS_ENVyang sedang ditinggalkan.
Ryan Bigg
4
Ryan, pada baris perintah, Anda tidak bisa menggunakan Rails.env. jadi jika itu segera ditinggalkan, lalu apa yang akan Anda gunakan pada CLI?
pjammer
8
Menggunakan Rails.env.production? mengamankan Anda dari kesalahan ketik yang benar-benar mengubah lingkungan seperti ini: RAILS_ENV = "produksi". Perhatikan tanda terjawab =.
Magne
Semua kerumitan konyol ini hanya supaya Anda bisa menggunakan tanda tanya?
Membuang Akun
31

ENV['RAILS_ENV']sekarang sudah ditinggalkan .

Anda harus menggunakan Rails.envyang jelas jauh lebih baik.

superluminary
sumber
29

Sebelum Rails 2.x cara yang disukai untuk mendapatkan lingkungan saat ini adalah menggunakan RAILS_ENVkonstanta. Demikian juga, Anda dapat menggunakan RAILS_DEFAULT_LOGGERuntuk mendapatkan logger saat ini atauRAILS_ROOT untuk mendapatkan path ke folder root.

Mulai dari Rails 2.x, Rails memperkenalkan Railsmodul dengan beberapa metode khusus:

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

Ini bukan hanya perubahan kosmetik. Modul Rails menawarkan kemampuan yang tidak tersedia menggunakan konstanta standar seperti StringInquirerdukungan. Ada juga sedikit perbedaan. Rails.roottidak mengembalikan Stringbuth sederhanaPath .

Bagaimanapun, cara yang disukai adalah menggunakan Railsmodul. Konstanta tidak digunakan lagi dalam Rails 3 dan akan dihapus dalam rilis mendatang, mungkin Rails 3.1.

Simone Carletti
sumber
1
FYI, dari apa yang dibahas di sini , sepertinya metode-metode itu diperkenalkan di Rails 2.3, bukan 2.0.
jrdioko
Kami menggunakan 2.1.2 pada suatu proyek. Rails.envbekerja tanpa masalah.
Benjamin Oakes
2

Perilaku aneh saat men-debug aplikasi saya: membutuhkan "active_support / notifikasi" (rdb: 1) p ENV ['RAILS_ENV'] "test" (rdb: 1) p Rails.env "development"

Saya akan mengatakan bahwa Anda harus tetap berpegang pada satu atau yang lain (dan lebih disukai Rails.env)

JuYo
sumber
2

Pembaruan: dalam Rails 3.0.9: metode env didefinisikan dalam railties / lib / rails.rb

jgpawletko
sumber