Làm cách nào để có đường dẫn thư mục gốc của ứng dụng Rails?
Làm cách nào để có đường dẫn thư mục gốc của ứng dụng Rails?
Câu trả lời:
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.
Rails.root.join(*%w( app assets images logo.png )).
Rails.root / 'app' / 'assets' / 'images' / 'logo.png'
Để 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 .
Rails.root.join('foo','bar')đánh giá đối tượng Pathname có @path là '/ Users / Purplejquet / my_rails_app / foo / bar'
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"
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
Rails.root + 'app/assets' không hoạt động, nhưng yeah joinlà gọn gàng hơn.
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 ...
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.