回答:
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をロードせずにRailsのルートが必要になることがあります。
たとえば、のspec_helper
代わりにを要求することにより、Railsに依存しないモデルをTDDする場合、フィードバックサイクルが速くなります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
これにより、仕様ファイルからプレーンオールドRubyオブジェクトを簡単にロードできます。
# spec/models/poro_spec.rb
require 'spec_helper'
require 'poro'
RSpec.describe ...