Answers:
在Rails 3和更高版本中:
Rails.root
返回一个Pathname
对象。如果您想要一个字符串,则必须添加.to_s
。如果您想在Rails应用程序中使用其他路径,可以这样使用join
:
Rails.root.join('app', 'assets', 'images', 'logo.png')
在Rails 2中,您可以使用RAILS_ROOT
常量,它是一个字符串。
Rails.root.join(*%w( app assets images logo.png ))
。
Rails.root / 'app' / 'assets' / 'images' / 'logo.png'
为了超级正确,您应该使用:
Rails.root.join('foo','bar')
/
如果有人尝试在一个目录分隔符上运行该应用程序,则该应用程序可以在不是目录分隔符的平台上运行。
Rails.root.join('foo','bar')
求值为@path为'/ Users / purplejacket / my_rails_app / foo / bar'的Pathname对象
您可以使用variable访问Rails应用程序路径RAILS_ROOT
。
例如:
render :file => "#{RAILS_ROOT}/public/layouts/mylayout.html.erb"
除了所有其他正确答案之外,由于它Rails.root
是一个Pathname
对象,因此无法使用:
Rails.root + '/app/assets/...'
您可以使用类似 join
Rails.root.join('app', 'assets')
如果要使用字符串,请使用以下命令:
Rails.root.join('app', 'assets').to_s
Rails.root + 'app/assets'
做的工作,但是,是join
的整洁。
在某些情况下,您可能希望Rails成为root,而不必加载Rails。
例如,当TDD的模型不依赖于Rails时,您可以使用spec_helper
而不是来获得更快的反馈周期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
这样,您就可以轻松地从规范文件中加载Plain Old Ruby Objects。
# spec/models/poro_spec.rb
require 'spec_helper'
require 'poro'
RSpec.describe ...