Jalur direktori Rails Root?


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.


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.


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"

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

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 ...

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.


-2

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


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


1
Harap hapus jawaban ini, ini hanya derau, tidak menambahkan apa pun pada pertanyaan, dan formatnya buruk.
luk2302
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.