Railsルートディレクトリパス?


307

Railsアプリのルートディレクトリパスを取得するにはどうすればよいですか?

回答:


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はPathnameのインスタンスであり、RAILS_ROOTは文字列です。
Richard

1
3.1以降のRails.rootのみ(ああ、CONSTANTを変更した場合;))
thanikkal

2
あなたもできますRails.root.join(*%w( app assets images logo.png ))
2014

12
個人的に私は新しい構文が好きです:Rails.root / 'app' / 'assets' / 'images' / 'logo.png'
Ajedi32

105

非常に正確にするには、以下を使用する必要があります。

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

これにより、/誰かがディレクトリセパレーターを使用していないプラットフォームでアプリを動作させることができます。


1
たとえば、私のMacBookではRails.root.join('foo','bar')、@ pathが '/ Users / purplejacket / my_rails_app / foo / bar'であるPathnameオブジェクトに評価されます
Purplejacket

21

variableを使用して、railsアプリのパスにアクセスできますRAILS_ROOT

例えば:

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

2
RAILS_ROOTはRailsの3.0 insted使用Rails.root以来depratedされる
vidur punj

15

他のすべての正解に加えて、Rails.rootPathnameオブジェクトなので、これは機能しません。

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

あなたは次のようなものを使うことができます join

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

文字列が必要な場合は、これを使用します。

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

1
実際にRails.root + 'app/assets' 機能しますが、そうjoinです。
ミーシャ

1
通常、ファイル区切りトークン(\または/)をハードコーディングすることはお勧めできません。
Alexander Bird

5

場合によっては、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 ...

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(app assets))。to_sで何かを追加する だけ


1
この回答を削除してください。これは単なるノイズであり、質問には何も追加されず、形式が正しくありません。
luk2302
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.