Jak uzyskać ścieżkę do katalogu głównego aplikacji Rails?
Jak uzyskać ścieżkę do katalogu głównego aplikacji Rails?
Odpowiedzi:
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.
Rails.root.join(*%w( app assets images logo.png )).
Rails.root / 'app' / 'assets' / 'images' / 'logo.png'
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.
Rails.root.join('foo','bar')ocenia obiekt Pathname, którego @ ścieżka to „/ Users / purplejacket / my_rails_app / foo / bar”
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"
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
Rails.root + 'app/assets' to działa, ale tak joinjest fajniej.
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 ...
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.