Rails.env vs RAILS_ENV


219

Tôi thấy cả hai trong các ví dụ khi kiểm tra env nào đang chạy. Cái gì được ưa thích? Là họ, cho tất cả ý định và mục đích như nhau?

Câu trả lời:


370

Theo các tài liệu , #Rails.envkết thúc tốt đẹp RAILS_ENV:

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

Nhưng, hãy xem cụ thể cách nó được bọc, sử dụng ActiveSupport::StringInquirer:

Gói một chuỗi trong lớp này cung cấp cho bạn một cách đẹp hơn để kiểm tra sự bằng nhau. Giá trị được trả về bởi Rails.env được gói trong một đối tượng StringInquirer vì vậy thay vì gọi đây:

Rails.env == "production"

bạn có thể gọi đây:

Rails.env.production?

Vì vậy, chúng không chính xác tương đương, nhưng chúng khá gần nhau. Tôi chưa sử dụng Rails nhiều, nhưng tôi nói #Rails.envchắc chắn là tùy chọn hấp dẫn trực quan hơn do sử dụng StringInquirer.


giải thích tốt đẹp, thx! Tôi cũng đang cố gắng tìm nơi RAILS_ENV được xác định? Bất kỳ ý tưởng??
brad

70
Điều đáng nói Rails.envlà tiêu chuẩn mới RAILS_ENVđang bị phản đối.
Ryan Bigg

4
Ryan, trên một dòng lệnh, bạn không thể sử dụng Rails.env. Vì vậy, nếu nó không còn sớm nữa, thì bạn sẽ sử dụng cái gì trên CLI?
pjammer

8
Sử dụng Rails.env.production? bảo vệ bạn khỏi lỗi chính tả thực sự thay đổi môi trường như thế này: RAILS_ENV = "sản xuất". Chú ý dấu =.
Magne

Tất cả sự phức tạp lố bịch này chỉ để bạn có thể sử dụng một dấu hỏi?
Vứt bỏ tài khoản

31

ENV['RAILS_ENV']hiện đang bị phản đối .

Bạn nên sử dụng Rails.envmà rõ ràng là đẹp hơn nhiều.


29

Trước Rails 2.x cách ưa thích để có được môi trường hiện tại là sử dụng RAILS_ENVhằng số. Tương tự như vậy, bạn có thể sử dụng RAILS_DEFAULT_LOGGERđể lấy logger hiện tại hoặc RAILS_ROOTđể có được đường dẫn đến thư mục gốc.

Bắt đầu từ Rails 2.x, Rails giới thiệu Railsmô-đun với một số phương pháp đặc biệt:

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

Đây không chỉ là một sự thay đổi mỹ phẩm. Mô-đun Rails cung cấp các khả năng không khả dụng bằng các hằng số tiêu chuẩn như StringInquirerhỗ trợ. Cũng có một số khác biệt nhỏ. Rails.rootkhông trả về Stringmột Pathví dụ đơn giản .

Dù sao, cách ưa thích là sử dụng Railsmô-đun. Các hằng số không được dùng trong Rails 3 và sẽ bị xóa trong bản phát hành trong tương lai, có lẽ là Rails 3.1.


1
FYI, từ những gì đã được thảo luận ở đây , có vẻ như các phương thức đó đã được giới thiệu trong Rails 2.3, không phải 2.0.
jrdioko

Chúng tôi đang sử dụng 2.1.2 trên một dự án. Rails.envhoạt động mà không có vấn đề gì
Benjamin Oakes

2

Hành vi kỳ lạ trong khi gỡ lỗi ứng dụng của tôi: yêu cầu "active_support / thông báo" (rdb: 1) p ENV ['RAILS_ENV'] "test" (rdb: 1) p Rails.env "phát triển"

Tôi sẽ nói rằng bạn nên bám lấy cái này hay cái khác (và tốt nhất là Rails.env)


2

Cập nhật: trong Rails 3.0.9: phương thức env được xác định trong đường ray / lib / rails.rb

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.