【发布时间】:2011-04-13 01:48:12
【问题描述】:
如何获取 Rails 应用的根目录路径?
【问题讨论】:
标签: ruby-on-rails
如何获取 Rails 应用的根目录路径?
【问题讨论】:
标签: ruby-on-rails
module Rails
def self.root
File.expand_path("..", __dir__)
end
end
【讨论】:
【讨论】:
Rails.root.join(*%w( app assets images logo.png ))。
Rails.root / 'app' / 'assets' / 'images' / 'logo.png'
只需编写 Rails.root 并附加任何内容 Rails.root.join(*%w(app assets)).to_s
【讨论】:
只需通过 Rails.root 或者如果您想附加一些东西,我们可以使用它,例如 Rails.root.join('app', 'assets').to_s
【讨论】:
在某些情况下,您可能需要 Rails 根目录而不需要加载 Rails。
例如,通过要求 spec_helper 而不是 rails_helper 来对不依赖 Rails 的模型进行 TDD 时,您可以获得更快的反馈周期。
# 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
这使您可以轻松地从其规范文件中加载普通旧 Ruby 对象。
# spec/models/poro_spec.rb
require 'spec_helper'
require 'poro'
RSpec.describe ...
【讨论】:
你可以使用:
Rails.root
但是要加入你可以使用的资产:
Rails.root.join(*%w( app assets))
希望这对您有所帮助。
【讨论】:
除了所有其他正确答案之外,由于 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 应用程序路径。
例如:
render :file => "#{RAILS_ROOT}/public/layouts/mylayout.html.erb"
【讨论】:
为了超级正确,你应该使用:
Rails.root.join('foo','bar')
这将允许您的应用在/ 不是目录分隔符的平台上运行,如果有人尝试在其中运行它的话。
【讨论】:
Rails.root.join('foo','bar') 计算为 @path 为 '/Users/purplejacket/my_rails_app/foo/bar' 的 Pathname 对象