Rails Ścieżka do katalogu głównego?

307

Jak uzyskać ścieżkę do katalogu głównego aplikacji Rails?

fivetwentysix
źródło

Odpowiedzi:

545

W Rails 3 i nowszych:

Rails.root

który zwraca Pathnameobiekt. Jeśli chcesz ciąg, musisz go dodać .to_s. Jeśli chcesz mieć inną ścieżkę w aplikacji Rails, możesz użyć jointego w następujący sposób:

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

W Railsach 2 możesz użyć RAILS_ROOTstałej, która jest łańcuchem.

Mischa
źródło
2
W Rails 2.3 Rails.root jest instancją Pathname, gdzie RAILS_ROOT jest łańcuchem.
Richard,
1
Tylko Rails.root w wersji 3.1 i nowszych (ahh .. przypadek zmiany CONSTANT;))
thanikkal 10.11.11
2
Ty też możesz Rails.root.join(*%w( app assets images logo.png )).
Nate
12
Osobiście podoba mi się nowa składnia:Rails.root / 'app' / 'assets' / 'images' / 'logo.png'
Ajedi32
105

Aby uzyskać super poprawność, należy użyć:

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

co pozwoli twojej aplikacji działać na platformach, na których /nie ma separatora katalogów, jeśli ktoś spróbuje uruchomić ją na jednym.

Malclocke
źródło
1
Na przykład na moim MacBooku Rails.root.join('foo','bar')ocenia obiekt Pathname, którego @ ścieżka to „/ Users / purplejacket / my_rails_app / foo / bar”
Purplejacket
21

Możesz uzyskać dostęp do ścieżki aplikacji Railsowej za pomocą zmiennej RAILS_ROOT.

Na przykład:

render :file => "#{RAILS_ROOT}/public/layouts/mylayout.html.erb"
Anubhaw
źródło
2
RAILS_ROOT jest deprecjonowany, ponieważ instancja Rails 3.0 używa
Rails.root
15

Oprócz wszystkich innych poprawnych odpowiedzi, ponieważ Rails.rootjest to Pathnameobiekt, to nie zadziała:

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

Możesz użyć czegoś takiego join

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

Jeśli chcesz ciąg, użyj tego:

Rails.root.join('app', 'assets').to_s
Andrzej
źródło
1
Właściwie Rails.root + 'app/assets' to działa, ale tak joinjest fajniej.
Mischa
1
Zwykle nie jest dobrym pomysłem na kodowanie tokena separatora plików (\ lub /).
Alexander Bird
5

W niektórych przypadkach możesz chcieć rootować Railsy bez konieczności ładowania Railsów.

Na przykład, otrzymujesz szybszy cykl sprzężenia zwrotnego, gdy modele TDD, które nie zależą od Railsów, spec_helperzamiast tego wymagają 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

Co pozwala łatwo załadować zwykłe stare obiekty Ruby z ich plików specyfikacji.

# spec/models/poro_spec.rb

require 'spec_helper'

require 'poro'

RSpec.describe ...
Dennis
źródło
0

Możesz użyć:

Rails.root

Aby jednak dołączyć do zasobów, możesz użyć:

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

Mam nadzieję, że to ci pomoże.

Ali Hassan Mirza
źródło
-2

Po prostu przez Rails.root lub jeśli chcesz coś dodać, możemy użyć tego jak Rails.root.join („aplikacja”, „zasoby”).

Amit
źródło
Proszę usunąć tę odpowiedź, to tylko hałas, nic nie dodaje do pytania.
luk2302
-5

Po prostu pisząc Rails.root i dołączając cokolwiek przez Rails.root.join (*% w (zasoby aplikacji)). To_s

sumit
źródło
1
Usuń tę odpowiedź, to tylko szum, nic nie dodaje do pytania i jest źle sformatowany.
luk2302