Ruta del directorio raíz de Rails?


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.


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.


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"

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

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 ...

0

Puedes usar:

Rails.root

Pero para unirte a los activos puedes usar:

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

Espero que esto te ayude.


-2

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


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


1
Elimine esta respuesta, es solo ruido, no agrega nada a la pregunta y está mal formateada.
luk2302
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.