Caminho do diretório raiz do Rails?

307

Como obtenho o caminho do diretório raiz do meu aplicativo Rails?

fivetwentysix
fonte

Respostas:

545

No Rails 3 e mais recente:

Rails.root

que retorna um Pathnameobjeto. Se você quer uma string, você deve adicionar .to_s. Se você deseja outro caminho no seu aplicativo Rails, pode usar o joinseguinte:

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

No Rails 2, você pode usar a RAILS_ROOTconstante, que é uma string.

Mischa
fonte
2
No Rails 2.3, o Rails.root é uma instância do nome do caminho em que RAILS_ROOT é uma string.
Richard
1
Somente Rails.root no 3.1 e posterior (ahh .. o caso de mudar CONSTANT;)) #
thanikkal
2
Você também pode Rails.root.join(*%w( app assets images logo.png )).
Nate
12
Pessoalmente eu gosto da nova sintaxe:Rails.root / 'app' / 'assets' / 'images' / 'logo.png'
Ajedi32
105

Para super correção, você deve usar:

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

que permitirá que seu aplicativo funcione em plataformas onde /não existe o separador de diretório, se alguém tentar executá-lo em um.

malclocke
fonte
1
Por exemplo, no meu MacBook, é Rails.root.join('foo','bar')avaliado o objeto Nome do caminho cujo @caminho é '/ Users / purplejacket / my_rails_app / foo / bar'
Purplejacket
21

Você pode acessar rails caminho aplicativo usando variável RAILS_ROOT.

Por exemplo:

render :file => "#{RAILS_ROOT}/public/layouts/mylayout.html.erb"
Anubhaw
fonte
2
RAILS_ROOT está obsoleto desde que o Rails 3.0 instou o uso do Rails.root
Enviado em 23/11/2012
15

Além de todas as outras respostas corretas, como Rails.rooté um Pathnameobjeto, isso não funcionará:

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

Você poderia usar algo como join

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

Se você deseja uma string, use isto:

Rails.root.join('app', 'assets').to_s
Andrew
fonte
1
Realmente Rails.root + 'app/assets' faz o trabalho, mas sim joiné mais puro.
precisa
1
Geralmente, não é uma boa ideia codificar qual é o token do separador de arquivos (\ ou /).
Alexander Pássaro
5

Em alguns casos, você pode querer a raiz do Rails sem precisar carregar o Rails.

Por exemplo, você obtém um ciclo de feedback mais rápido ao TDD'ing de modelos que não dependem do Rails exigindo em spec_helpervez de 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

O que permite carregar facilmente objetos antigos simples do Ruby a partir de seus arquivos de especificação.

# spec/models/poro_spec.rb

require 'spec_helper'

require 'poro'

RSpec.describe ...
Dennis
fonte
0

Você pode usar:

Rails.root

Mas, para ingressar nos ativos, você pode usar:

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

Espero que isso ajude você.

Ali Hassan Mirza
fonte
-2

Simplesmente pelo Rails.root ou se você quiser acrescentar algo, podemos usá-lo como Rails.root.join ('app', 'assets'). To_s

Amit
fonte
Por favor, exclua esta resposta, é apenas ruído, não adiciona nada à pergunta.
Luk2302
-5

Simplesmente escrevendo Rails.root e anexando qualquer coisa por Rails.root.join (*% w (ativos do aplicativo)). To_s

sumit
fonte
1
Exclua esta resposta, é apenas ruído, não adiciona nada à pergunta e está mal formatada.
Luk2302