Ruta del directorio raíz de Rails?

307

¿Cómo obtengo la ruta del directorio raíz de mi aplicación Rails?

fivetwentysix
fuente

Respuestas:

545

En Rails 3 y más reciente:

Rails.root

que devuelve un Pathnameobjeto Si desea una cadena, debe agregarla .to_s. Si desea otra ruta en su aplicación Rails, puede usarla joinasí:

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

En Rails 2 puedes usar la RAILS_ROOTconstante, que es una cadena.

Mischa
fuente
2
En Rails 2.3 Rails.root es una instancia de Pathname donde RAILS_ROOT es una cadena.
Richard
1
Solo Rails.root en 3.1 y posteriores (ahh .. el caso de cambiar CONSTANT;))
thanikkal
2
Tu también puedes Rails.root.join(*%w( app assets images logo.png )).
Nate
12
Personalmente, me gusta la sintaxis más nueva:Rails.root / 'app' / 'assets' / 'images' / 'logo.png'
Ajedi32
105

Para una súper corrección, debe usar:

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

lo que permitirá que su aplicación funcione en plataformas donde /no está el separador de directorios, en caso de que alguien intente ejecutarlo en uno.

Malclocke
fuente
1
Por ejemplo, en mi MacBook, se Rails.root.join('foo','bar')evalúa como objeto Pathname cuyo @path es '/ Users / purplejacket / my_rails_app / foo / bar'
Purplejacket
21

Puede acceder a la ruta de la aplicación rails usando variables RAILS_ROOT .

Por ejemplo:

render :file => "#{RAILS_ROOT}/public/layouts/mylayout.html.erb"
Anubhaw
fuente
2
RAILS_ROOT se depura desde que Rails 3.0 utiliza Rails.root en uso
vidur punj
15

Además de todas las otras respuestas correctas, dado que Rails.rootes un Pathnameobjeto, esto no funcionará:

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

Podrías usar algo como join

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

Si quieres una cadena usa esto:

Rails.root.join('app', 'assets').to_s
Andrés
fuente
1
En realidad Rails.root + 'app/assets' hace el trabajo, pero sí joines más ordenado.
Mischa
1
Por lo general, no es una buena idea codificar cuál es el token del separador de archivos (\ o /).
Alexander Bird
5

En algunos casos, es posible que desee la raíz de Rails sin tener que cargar Rails.

Por ejemplo, obtiene un ciclo de retroalimentación más rápido cuando TDD requiere modelos que no dependen de Rails al requerir en spec_helperlugar 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

Lo que le permite cargar fácilmente Objetos Ruby Plain Old de sus archivos de especificaciones.

# spec/models/poro_spec.rb

require 'spec_helper'

require 'poro'

RSpec.describe ...
Dennis
fuente
0

Puedes usar:

Rails.root

Pero para unirte a los activos puedes usar:

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

Espero que esto te ayude.

Ali Hassan Mirza
fuente
-2

Simplemente por Rails.root o si desea agregar algo, podemos usarlo como Rails.root.join ('app', 'assets'). To_s

Amit
fuente
Elimine esta respuesta, es solo ruido, no agrega nada a la pregunta.
luk2302
-5

Simplemente escribiendo Rails.root y agregue cualquier cosa por Rails.root.join (*% w (recursos de la aplicación)). To_s

sumitir
fuente
1
Elimine esta respuesta, es solo ruido, no agrega nada a la pregunta y está mal formateada.
luk2302