Rails根目录路径?

fiv*_*six 300 ruby-on-rails

如何获取Rails应用程序的根目录路径?

Mis*_*cha 532

在Rails 3和更新版本中:

Rails.root
Run Code Online (Sandbox Code Playgroud)

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

Rails.root.join('app', 'assets', 'images', 'logo.png')
Run Code Online (Sandbox Code Playgroud)

在Rails 2中,您可以使用RAILS_ROOT常量,即字符串.

  • 我个人喜欢更新的语法:`Rails.root /'app'/'assets'/'images'/'logo.png'` (11认同)
  • 在Rails 2.3中,Rails.root是Pathname的一个实例,其中RAILS_ROOT是一个字符串. (2认同)
  • 你也可以`Rails.root.join(*%w(app assets images logo.png))`. (2认同)

mal*_*cke 104

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

Rails.root.join('foo','bar')
Run Code Online (Sandbox Code Playgroud)

这将允许您的应用程序在/不是目录分隔符的平台上工作,任何人都可以尝试在其中运行它.


Anu*_*haw 21

您可以使用变量访问rails app path RAILS_ROOT.

例如:

render :file => "#{RAILS_ROOT}/public/layouts/mylayout.html.erb"
Run Code Online (Sandbox Code Playgroud)

  • RAILS_ROOT 已弃用,因为 Rails 3.0 使用 Rails.root (3认同)

And*_*rew 15

除了所有其他正确的答案,因为Rails.root是一个Pathname对象,这将不起作用:

Rails.root + '/app/assets/...'
Run Code Online (Sandbox Code Playgroud)

你可以用类似的东西 join

Rails.root.join('app', 'assets')
Run Code Online (Sandbox Code Playgroud)

如果你想要一个字符串使用这个:

Rails.root.join('app', 'assets').to_s
Run Code Online (Sandbox Code Playgroud)


Den*_*nis 5

在某些情况下,您可能需要 Rails 根目录而不必加载 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
Run Code Online (Sandbox Code Playgroud)

这使您可以轻松地从规范文件中加载普通的旧 Ruby 对象。

# spec/models/poro_spec.rb

require 'spec_helper'

require 'poro'

RSpec.describe ...
Run Code Online (Sandbox Code Playgroud)