Rails根目录路径?


Answers:


545

在Rails 3和更高版本中:

Rails.root

返回一个Pathname对象。如果您想要一个字符串,则必须添加.to_s。如果您想在Rails应用程序中使用其他路径,可以这样使用join

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

在Rails 2中,您可以使用RAILS_ROOT常量,它是一个字符串。


2
在Rails 2.3中,Rails.root是路径名的实例,其中RAILS_ROOT是字符串。
理查德

1
仅在3.1及更高版本中使用Rails.root(啊哈。改变常量的情况;)
thanikkal 2011年

2
您也可以Rails.root.join(*%w( app assets images logo.png ))
Nate

12
我个人喜欢更新的语法:Rails.root / 'app' / 'assets' / 'images' / 'logo.png'
Ajedi32 '16

105

为了超级正确,您应该使用:

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

/如果有人尝试在一个目录分隔符上运行该应用程序,则该应用程序可以在不是目录分隔符的平台上运行。


1
例如,在我的MacBook上,Rails.root.join('foo','bar')求值为@path为'/ Users / purplejacket / my_rails_app / foo / bar'的Pathname对象
Purplejacket 2012年

21

您可以使用variable访问Rails应用程序路径RAILS_ROOT

例如:

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

2
自从Rails 3.0安装使用Rails.root以来,RAILS_ROOT受到了鄙视
vidur punj

15

除了所有其他正确答案之外,由于它Rails.root是一个Pathname对象,因此无法使用:

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

您可以使用类似 join

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

如果要使用字符串,请使用以下命令:

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

1
其实Rails.root + 'app/assets' 的工作,但是,是join的整洁。
Mischa 2012年

1
硬编码什么是文件分隔符(\或/)通常不是一个好主意。
亚历山大·伯德

5

在某些情况下,您可能希望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 ...

0

您可以使用:

Rails.root

但是要加入资产,您可以使用:

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

希望这对您有所帮助。


-2

只需通过Rails.root或如果您想要添加一些内容,我们就可以使用它,例如Rails.root.join('app','assets')。to_s


请删除此答案,这只是噪音,不会对问题添加任何内容。
luk2302

-5

只需编写Rails.root 并通过Rails.root.join(*%w(应用程序资产))。to_s附加任何内容


1
请删除此答案,这只是杂音,没有在问题中添加任何内容,而且格式不正确。
luk2302
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.