339

How do I get my Rails app's root directory path?

9 Answers 9

602

In Rails 3 and newer:

Rails.root

which returns a Pathname object. If you want a string you have to add .to_s. If you want another path in your Rails app, you can use join like this:

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

In Rails 2 you can use the RAILS_ROOT constant, which is a string.

Sign up to request clarification or add additional context in comments.

4 Comments

In Rails 2.3 Rails.root is an instance of Pathname where RAILS_ROOT is a string.
Only Rails.root in 3.1 and later (ahh.. the case of changing CONSTANT ;))
You can also Rails.root.join(*%w( app assets images logo.png )).
Personally I like the newer syntax: Rails.root / 'app' / 'assets' / 'images' / 'logo.png'
113

For super correctness, you should use:

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

which will allow your app to work on platforms where / is not the directory separator, should anyone try and run it on one.

1 Comment

For example, on my MacBook, Rails.root.join('foo','bar') evaluates to Pathname object whose @path is '/Users/purplejacket/my_rails_app/foo/bar'
24

You can access rails app path using variable RAILS_ROOT.

For example:

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

1 Comment

RAILS_ROOT is deprated since Rails 3.0 insted use Rails.root
17

In addition to all the other correct answers, since Rails.root is a Pathname object, this won't work:

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

You could use something like join

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

If you want a string use this:

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

2 Comments

Actually Rails.root + 'app/assets' does work, but yeah join is neater.
It's usually not a good idea to hardcode what the file separator token is (\ or /).
6

In some cases you may want the Rails root without having to load Rails.

For example, you get a quicker feedback cycle when TDD'ing models that do not depend on Rails by requiring spec_helper instead of 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

Which allows you to easily load Plain Old Ruby Objects from their spec files.

# spec/models/poro_spec.rb

require 'spec_helper'

require 'poro'

RSpec.describe ...

Comments

2
module Rails
  def self.root
    File.expand_path("..", __dir__)
  end
end

source: https://github.com/rails/rails/blob/5259062868dcf10fbcf735d6520e6a14e15fdcdb/actionmailer/test/abstract_unit.rb#L12

Comments

0

You can use:

Rails.root

But to to join the assets you can use:

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

Hopefully this helps you.

Comments

-4

Simply by Rails.root or if you want append something we can use it like Rails.root.join('app', 'assets').to_s

1 Comment

Please delete this answer, it is just noise, does not add anything to the question.
-8

Simply By writing Rails.root and append anything by Rails.root.join(*%w( app assets)).to_s

1 Comment

Please delete this answer, it is just noise, does not add anything to the question and it is poorly formatted.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.