Rails Root đường dẫn thư mục?


Câu trả lời:


545

Trong Rails 3 và mới hơn:

Rails.root

trong đó trả về một Pathnameđối tượng. Nếu bạn muốn một chuỗi bạn phải thêm .to_s. Nếu bạn muốn một đường dẫn khác trong ứng dụng Rails, bạn có thể sử dụng joinnhư thế này:

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

Trong Rails 2, bạn có thể sử dụng RAILS_ROOThằng số, đó là một chuỗi.


2
Trong Rails 2.3 Rails.root là một phiên bản của Pathname trong đó RAILS_ROOT là một chuỗi.
Richard

1
Chỉ Rails.root trong 3.1 trở lên (ahh .. trường hợp thay đổi CONSTANT;))
thanikkal

2
Bạn cũng có thể Rails.root.join(*%w( app assets images logo.png )).
Nate

12
Cá nhân tôi thích cú pháp mới hơn:Rails.root / 'app' / 'assets' / 'images' / 'logo.png'
Ajedi32

105

Để siêu chính xác, bạn nên sử dụng:

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

sẽ cho phép ứng dụng của bạn hoạt động trên các nền tảng /không phải là trình phân tách thư mục, bất kỳ ai cũng nên thử và chạy nó trên một nền tảng .


1
Ví dụ: trên MacBook của tôi, hãy Rails.root.join('foo','bar')đánh giá đối tượng Pathname có @path là '/ Users / Purplejquet / my_rails_app / foo / bar'
Purplejquet

21

Bạn có thể truy cập đường dẫn ứng dụng rails bằng cách sử dụng biến RAILS_ROOT.

Ví dụ:

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

2
RAILS_ROOT bị hủy bỏ kể từ khi Rails 3.0 bắt đầu sử dụng Rails.root
vidur trừngj

15

Ngoài tất cả các câu trả lời đúng khác, vì Rails.rootlà một Pathnameđối tượng, điều này sẽ không hoạt động:

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

Bạn có thể sử dụng một cái gì đó như join

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

Nếu bạn muốn một chuỗi sử dụng này:

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

1
Thực tế Rails.root + 'app/assets' không hoạt động, nhưng yeah joinlà gọn gàng hơn.
Mischa

1
Thông thường không nên mã hóa mã thông báo phân tách tệp là gì (\ hoặc /).
Alexander Bird

5

Trong một số trường hợp, bạn có thể muốn root Rails mà không phải tải Rails.

Ví dụ: bạn nhận được chu kỳ phản hồi nhanh hơn khi các mô hình TDD không phụ thuộc vào Rails bằng cách yêu cầu spec_helperthay vì 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

Cho phép bạn dễ dàng tải Plain Old Ruby Object từ các tệp spec của chúng.

# spec/models/poro_spec.rb

require 'spec_helper'

require 'poro'

RSpec.describe ...

0

Bạn có thể dùng:

Rails.root

Nhưng để tham gia các tài sản bạn có thể sử dụng:

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

Hy vọng điều này sẽ giúp bạn.


-2

Đơn giản chỉ bằng Rails.root hoặc nếu bạn muốn nối thêm thứ gì đó, chúng ta có thể sử dụng nó như Rails.root.join ('ứng dụng', 'nội dung'). To_s


Vui lòng xóa câu trả lời này, nó chỉ là tiếng ồn, không thêm bất cứ điều gì vào câu hỏi.
luk2302

-5

Đơn giản bằng cách viết Rails.root và nối thêm bất cứ thứ gì bằng Rails.root.join (*% w (tài sản ứng dụng)).


1
Vui lòng xóa câu trả lời này, nó chỉ là tiếng ồn, không thêm bất cứ điều gì vào câu hỏi và nó được định dạng kém.
luk2302
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.