How do I get my Rails app's root directory path?
9 Answers
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.
4 Comments
Rails.root.join(*%w( app assets images logo.png )).Rails.root / 'app' / 'assets' / 'images' / 'logo.png'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
Rails.root.join('foo','bar') evaluates to Pathname object whose @path is '/Users/purplejacket/my_rails_app/foo/bar'You can access rails app path using variable RAILS_ROOT.
For example:
render :file => "#{RAILS_ROOT}/public/layouts/mylayout.html.erb"
1 Comment
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
Rails.root + 'app/assets' does work, but yeah join is neater.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
module Rails
def self.root
File.expand_path("..", __dir__)
end
end
Comments
Simply by Rails.root or if you want append something we can use it like Rails.root.join('app', 'assets').to_s
1 Comment
Simply By writing Rails.root and append anything by Rails.root.join(*%w( app assets)).to_s