2010-09-16 23 views

Odpowiedz

467

w szynach 3 i wyższa:

Rails.root 

która zwraca Pathname obiektu. Jeśli chcesz ciąg, musisz dodać .to_s. Jeśli chcesz inną ścieżkę w aplikacji Rails, można użyć join takiego:

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

W Rails 2 można użyć RAILS_ROOT stały, który jest ciągiem.

+2

W Railsach 2.3 Rails.root jest instancją Pathname, gdzie RAILS_ROOT jest ciągiem znaków. – Richard

+1

Tylko Rails.root w wersji 3.1 i późniejszych (ahh .. przypadek zmieniania CONSTANT;)) – thanikkal

+1

Możesz także "Rails.root.join (*% w (obrazy aktywów aplikacji logo.png))". – Nate

21

Możesz uzyskać dostęp do ścieżki aplikacji rails przy użyciu zmiennej RAILS_ROOT.

Na przykład:

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

RAILS_ROOT jest odrzucony od czasu użycia Rails 3.0 za pomocą Rails.root –

96

Super poprawności, należy użyć:

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

która pozwoli aplikacji do pracy na platformach gdzie / nie jest separator katalogu, gdyby ktoś spróbować uruchom go na jednym.

+1

Na przykład na moim MacBooku , 'Rails.root.join ('foo', 'bar')' oznacza obiekt Pathname, którego @ ścieżka to '/ Users/purplejacket/my_rails_app/foo/bar' – Purplejacket

12

Poza wszystkimi innymi prawidłowymi odpowiedziami, ponieważ Rails.root jest Pathname przedmiot, to nie będzie działać:

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

Można użyć coś jak join

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

Jeśli chcesz ciąg znaków:

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

Właściwie 'Rails.root + 'app/assets'' * działa *, ale tak, "dołącz" jest lepsze. – Mischa

+1

Zwykle nie jest dobrym pomysłem, aby zakodować na stałe token separatora plików (\ lub /). –

0

Możesz używać:

Rails.root 

Ale żeby przyłączyć się do aktywów można użyć:

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

Mam nadzieję, że to pomaga.

2

W niektórych przypadkach możesz potrzebować rootu Rails bez konieczności ładowania Railsów.

Na przykład, uzyskujesz szybszy cykl zwrotny, gdy modele TDD nie zależą od szyn, wymagając spec_helper zamiast 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 

Umożliwia to łatwe ładowanie zwykłych starych obiektów Ruby z ich plików spec.

# spec/models/poro_spec.rb 

require 'spec_helper' 

require 'poro' 

RSpec.describe ... 
-1

Wystarczy Rails.root lub jeśli chcesz dołączyć coś możemy użyć go jak Rails.root.join ('app', 'aktywa'). To_s

+0

Proszę usunąć tę odpowiedź, to tylko szum, nie dodaje nic do pytania. – luk2302

-1

po prostu pisząc Rails.root i dopisz wszystko przez Rails.root.join (*% w (zasoby aplikacji)).to_s

+0

Proszę usunąć tę odpowiedź, to tylko szum, nie dodaje nic do pytania i jest źle sformatowany. – luk2302

Powiązane problemy