Jalur direktori Rails Root?

307

Bagaimana cara mendapatkan jalur direktori root aplikasi Rails saya?

fivetwentysix
sumber

Jawaban:

545

Di Rails 3 dan yang lebih baru:

Rails.root

yang mengembalikan Pathnameobjek. Jika Anda ingin string, Anda harus menambahkan .to_s. Jika Anda ingin jalur lain di aplikasi Rails Anda, Anda dapat menggunakan joinseperti ini:

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

Di Rails 2 Anda dapat menggunakan RAILS_ROOTkonstanta, yang merupakan string.

Mischa
sumber
2
Di Rails 2.3 Rails.root adalah turunan dari Pathname di mana RAILS_ROOT adalah string.
Richard
1
Hanya Rails.root dalam 3.1 dan yang lebih baru (ahh .. kasus perubahan KONSTAN;))
thanikkal
2
Anda juga bisa Rails.root.join(*%w( app assets images logo.png )).
Nate
12
Secara pribadi saya suka sintaks yang lebih baru:Rails.root / 'app' / 'assets' / 'images' / 'logo.png'
Ajedi32
105

Untuk ketepatan super, Anda harus menggunakan:

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

yang akan memungkinkan aplikasi Anda untuk bekerja pada platform /yang bukan pemisah direktori, harus ada yang mencoba dan menjalankannya pada satu.

malclocke
sumber
1
Misalnya, di MacBook saya, Rails.root.join('foo','bar')mengevaluasi ke objek Pathname yang @path adalah '/ Users / purplejacket / my_rails_app / foo / bar'
Purplejacket
21

Anda dapat mengakses jalur aplikasi rel menggunakan variabel RAILS_ROOT.

Sebagai contoh:

render :file => "#{RAILS_ROOT}/public/layouts/mylayout.html.erb"
Anubhaw
sumber
2
RAILS_ROOT didegradasi sejak Rails 3.0 menggunakan Rails.root
vidur punj
15

Selain semua jawaban yang benar lainnya, karena Rails.rootmerupakan Pathnameobjek, ini tidak akan berfungsi:

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

Anda bisa menggunakan sesuatu seperti join

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

Jika Anda ingin string gunakan ini:

Rails.root.join('app', 'assets').to_s
Andrew
sumber
1
Sebenarnya Rails.root + 'app/assets' tidak bekerja, tapi ya joinini lebih rapi.
Mischa
1
Biasanya bukan ide yang baik untuk melakukan hardcode apa token pemisah file itu (\ atau /).
Alexander Bird
5

Dalam beberapa kasus, Anda mungkin menginginkan root Rails tanpa harus memuat Rails.

Misalnya, Anda mendapatkan siklus umpan balik yang lebih cepat ketika model TDD yang tidak bergantung pada Rails dengan meminta spec_helperalih - alih rails_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

Yang memungkinkan Anda untuk dengan mudah memuat Obyek Ruby Lama Biasa dari file spesifikasi mereka.

# spec/models/poro_spec.rb

require 'spec_helper'

require 'poro'

RSpec.describe ...
Dennis
sumber
0

Kamu bisa memakai:

Rails.root

Tetapi untuk bergabung dengan aset Anda dapat menggunakan:

Rails.root.join(*%w( app assets))

Semoga ini bisa membantu Anda.

Ali Hassan Mirza
sumber
-2

Cukup dengan Rails.root atau jika Anda ingin menambahkan sesuatu, kami dapat menggunakannya seperti Rails.root.join ('aplikasi', 'aset'). To_s

Amit
sumber
Harap hapus jawaban ini, ini hanya derau, tidak menambahkan apa pun ke pertanyaan.
luk2302
-5

Cukup Dengan menulis Rails.root dan menambahkan apa pun dengan Rails.root.join (*% w (aset aplikasi)). To_s

sumit
sumber
1
Harap hapus jawaban ini, ini hanya derau, tidak menambahkan apa pun pada pertanyaan, dan formatnya buruk.
luk2302