Percorso della directory principale di Rails?


307

Come posso ottenere il percorso della directory principale della mia app Rails?

Risposte:


545

In Rails 3 e versioni successive:

Rails.root

che restituisce un Pathnameoggetto. Se vuoi una stringa devi aggiungere .to_s. Se desideri un altro percorso nell'app Rails, puoi utilizzare in joinquesto modo:

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

In Rails 2 puoi usare la RAILS_ROOTcostante, che è una stringa.


2
In Rails 2.3 Rails.root è un'istanza di Pathname in cui RAILS_ROOT è una stringa.
Richard,

1
Solo Rails.root in 3.1 e versioni successive (ahh .. il caso di cambiare COSTANTE;))
thanikkal

2
Puoi anche Rails.root.join(*%w( app assets images logo.png )).
Nate,

12
Personalmente mi piace la sintassi più recente:Rails.root / 'app' / 'assets' / 'images' / 'logo.png'
Ajedi32

105

Per una super correttezza, dovresti usare:

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

che consentirà alla tua app di funzionare su piattaforme in cui /non è presente il separatore di directory, nel caso qualcuno dovesse tentare di eseguirlo su una.


1
Ad esempio, sul mio MacBook, Rails.root.join('foo','bar')restituisce l'oggetto Pathname il cui @path è '/ Users / purplejacket / my_rails_app / foo / bar'
Purplejacket

21

Puoi accedere al percorso dell'app Rails usando la variabile RAILS_ROOT.

Per esempio:

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

2
RAILS_ROOT è depresso poiché Rails 3.0 ha utilizzato Rails.root
vidur punj

15

Oltre a tutte le altre risposte corrette, poiché Rails.rootè un Pathnameoggetto, questo non funzionerà:

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

Potresti usare qualcosa del genere join

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

Se vuoi una stringa usa questo:

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

1
In realtà Rails.root + 'app/assets' fa il lavoro, ma sì joinè più ordinato.
Mischa,

1
Di solito non è una buona idea codificare quale sia il token del separatore di file (\ o /).
Alexander Bird,

5

In alcuni casi potresti volere il root di Rails senza dover caricare Rails.

Ad esempio, si ottiene un ciclo di feedback più rapido quando si utilizzano modelli TDD che non dipendono da Rails richiedendo spec_helperinvece di 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

Ciò consente di caricare facilmente Plain Old Ruby Objects dai loro file di specifiche.

# spec/models/poro_spec.rb

require 'spec_helper'

require 'poro'

RSpec.describe ...

0

Puoi usare:

Rails.root

Ma per unire le risorse è possibile utilizzare:

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

Spero che questo ti aiuti.


-2

Semplicemente da Rails.root o se vuoi aggiungere qualcosa, possiamo usarlo come Rails.root.join ('app', 'assets'). To_s


Elimina questa risposta, è solo rumore, non aggiunge nulla alla domanda.
luk2302,

-5

Semplicemente scrivendo Rails.root e aggiungendo qualsiasi cosa da Rails.root.join (*% w (risorse dell'app)). To_s


1
Elimina questa risposta, è solo rumore, non aggiunge nulla alla domanda ed è mal formattato.
luk2302,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.