เส้นทางไดเรกทอรีราก Rails?


คำตอบ:


545

ใน Rails 3 และใหม่กว่า:

Rails.root

ซึ่งส่งคืนPathnameวัตถุ .to_sหากคุณต้องการสตริงคุณจะต้องเพิ่ม หากคุณต้องการเส้นทางใหม่ในแอพ Rails ของคุณคุณสามารถใช้joinสิ่งนี้:

Rails.root.join('app', 'assets', 'images', 'logo.png')

ใน Rails 2 คุณสามารถใช้RAILS_ROOTค่าคงที่ซึ่งเป็นสตริง


2
ใน Rails 2.3 Rails.root เป็นตัวอย่างของ Pathname โดยที่ RAILS_ROOT เป็นสตริง
Richard

1
Rails.root เฉพาะใน 3.1 และหลังจากนั้น (ahh .. กรณีเปลี่ยนค่าคงที่))
thanikkal

2
Rails.root.join(*%w( app assets images logo.png ))คุณยังสามารถ
เนท

12
โดยส่วนตัวแล้วฉันชอบไวยากรณ์ที่ใหม่กว่า:Rails.root / 'app' / 'assets' / 'images' / 'logo.png'
Ajedi32

105

เพื่อความถูกต้องสุดคุณควรใช้:

Rails.root.join('foo','bar')

ซึ่งจะช่วยให้แอปของคุณทำงานบนแพลตฟอร์มที่/ไม่ใช่ตัวแยกไดเรกทอรีทุกคนควรลองและเรียกใช้ในที่เดียว


1
ตัวอย่างเช่นบน MacBook ของฉันRails.root.join('foo','bar')ประเมินเป็นวัตถุ Pathname ที่ @path คือ '/ Users / purplejacket / my_rails_app / foo / bar'
Purplejacket

21

คุณสามารถเข้าถึงเส้นทางแอพทางรางโดยใช้ตัวแปร RAILS_ROOTคุณสามารถเข้าถึงแอพพลิเครางเส้นทางใช้ตัวแปร

ตัวอย่างเช่น:

render :file => "#{RAILS_ROOT}/public/layouts/mylayout.html.erb"

2
RAILS_ROOT ถูก dep dep ตั้งแต่ Rails 3.0 ติดตั้งใช้ Rails.root
vidur punj

15

นอกจากคำตอบที่ถูกต้องอื่น ๆ ทั้งหมดเนื่องจากRails.rootเป็นPathnameวัตถุสิ่งนี้จะไม่ทำงาน:

Rails.root + '/app/assets/...'

คุณสามารถใช้สิ่งที่ชอบ join

Rails.root.join('app', 'assets')

หากคุณต้องการสตริงใช้สิ่งนี้:

Rails.root.join('app', 'assets').to_s

1
อันที่จริงRails.root + 'app/assets' ไม่ทำงาน แต่ใช่joinเป็น neater
Mischa

1
โดยทั่วไปแล้วไม่ใช่ความคิดที่ดีที่จะฮาร์โค้ดว่าโทเค็นตัวคั่นไฟล์คืออะไร (\ หรือ /)
Alexander Bird

5

ในบางกรณีคุณอาจต้องการรูทของ Rails โดยไม่ต้องโหลด Rails

ตัวอย่างเช่นคุณจะได้รับการตอบรับรอบได้เร็วขึ้นเมื่อรุ่น TDD'ing ที่ทำไม่ได้ขึ้นอยู่กับทางรถไฟโดยการกำหนดให้แทนspec_helperrails_helper

# spec/spec_helper.rb

require 'pathname'

rails_root = Pathname.new('..').expand_path(File.dirname(__FILE__))

[
  rails_root.join('app', 'models'),
  # Add your decorators, services, etc.
].each do |path|
  $LOAD_PATH.unshift path.to_s
end

ซึ่งช่วยให้คุณโหลดอ็อบเจกต์ Ruby Old Plain ได้อย่างง่ายดายจากไฟล์ข้อมูลจำเพาะ

# spec/models/poro_spec.rb

require 'spec_helper'

require 'poro'

RSpec.describe ...


-2

เพียงแค่ใช้ Rails.root หรือหากคุณต้องการผนวกสิ่งที่เราสามารถใช้ได้เช่น Rails.root.join ('app', 'สินทรัพย์') to_s


โปรดลบคำตอบนี้มันเป็นเพียงเสียงรบกวนไม่เพิ่มอะไรให้กับคำถาม
luk2302

-5

เพียงแค่เขียนRails.root และต่อท้ายสิ่งใดก็ได้โดย Rails.root.join (*% w (เนื้อหาแอป)) to_s


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