Rails.env กับ RAILS_ENV


219

ฉันเห็นทั้งสองตัวอย่างเมื่อตรวจสอบสิ่งที่ env หนึ่งทำงานสิ่งที่ต้องการคืออะไร พวกเขาสำหรับทุกเจตนาและวัตถุประสงค์เท่ากันหรือไม่

คำตอบ:


370

อ้างอิงจากเอกสาร , #Rails.envwraps 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.envStringInquirer


คำอธิบายที่ดีขอบคุณ! ฉันกำลังพยายามค้นหาว่า RAILS_ENV กำหนดไว้อย่างไร ความคิดใด ๆ ??
แบรด

70
เป็นมูลค่าการกล่าวขวัญว่าRails.envเป็นมาตรฐานใหม่ตามที่RAILS_ENVถูกคัดค้าน
Ryan Bigg

4
Ryan ในบรรทัดคำสั่งคุณไม่สามารถใช้ Rails.env ดังนั้นถ้ามันลดลงเร็ว ๆ นี้คุณจะใช้อะไรกับ CLI
pjammer

8
ใช้ Rails.env.production ปกป้องคุณจากการพิมพ์ผิดที่เปลี่ยนสภาพแวดล้อมเช่นนี้: RAILS_ENV = "การผลิต" สังเกตเห็นเครื่องหมาย miss =
Magne

ความซับซ้อนที่ไร้สาระทั้งหมดนี้เพื่อให้คุณสามารถใช้เครื่องหมายคำถามได้หรือไม่
ทิ้งบัญชี

31

ENV['RAILS_ENV']คือตอนนี้เลิกใช้

คุณควรใช้Rails.envซึ่งดีกว่ามากอย่างชัดเจน


29

Before 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ไม่ได้กลับง่ายStringbuth Pathอินสแตนซ์

อย่างไรก็ตามวิธีที่ต้องการคือการใช้Railsโมดูล ค่าคงที่จะถูกคัดค้านใน Rails 3 และจะถูกลบในการเปิดตัวในอนาคตอาจจะเป็น Rails 3.1


1
FYI จากสิ่งที่กล่าวถึงที่นี่ดูเหมือนว่าวิธีการเหล่านั้นถูกนำมาใช้ใน Rails 2.3 ไม่ใช่ 2.0
jrdioko

เราใช้ 2.1.2 ในโครงการ Rails.envทำงานได้โดยไม่มีปัญหา
Benjamin Oakes

2

พฤติกรรมแปลก ๆ ขณะตรวจแก้จุดบกพร่องแอพของฉัน: ต้องการ "active_support / การแจ้งเตือน" (rdb: 1) p ENV ['RAILS_ENV'] "ทดสอบ" (rdb: 1) p Rails.env "การพัฒนา"

ฉันจะบอกว่าคุณควรติดกับหนึ่งหรืออื่น (และโดยเฉพาะอย่างยิ่ง Rails.env)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.