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


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.


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.


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"

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

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

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.


-2

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


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


1
Usuń tę odpowiedź, to tylko szum, nic nie dodaje do pytania i jest źle sformatowany.
luk2302
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.