Rails Root-Verzeichnispfad?

307

Wie erhalte ich den Stammverzeichnispfad meiner Rails-App?

fünfundsechzig
quelle

Antworten:

545

In Rails 3 und neuer:

Rails.root

welches ein PathnameObjekt zurückgibt . Wenn Sie eine Zeichenfolge möchten, müssen Sie diese hinzufügen .to_s. Wenn Sie einen anderen Pfad in Ihrer Rails-App möchten, können Sie Folgendes verwenden join:

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

In Rails 2 können Sie die RAILS_ROOTKonstante verwenden, bei der es sich um eine Zeichenfolge handelt.

Mischa
quelle
2
In Rails 2.3 ist Rails.root eine Instanz von Pathname, wobei RAILS_ROOT eine Zeichenfolge ist.
Richard
1
Nur Rails.root in 3.1 und höher (ahh .. der Fall der Änderung von CONSTANT;))
thanikkal
2
Sie können auch Rails.root.join(*%w( app assets images logo.png )).
Nate
12
Persönlich mag ich die neuere Syntax:Rails.root / 'app' / 'assets' / 'images' / 'logo.png'
Ajedi32
105

Für eine hervorragende Korrektheit sollten Sie Folgendes verwenden:

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

Dadurch kann Ihre App auf Plattformen ausgeführt werden, auf denen /sich kein Verzeichnistrennzeichen befindet, falls jemand versucht, sie auf einer auszuführen.

Malclocke
quelle
1
Auf meinem MacBook wird beispielsweise ein Rails.root.join('foo','bar')Pathname-Objekt ausgewertet, dessen @ path '/ Users / lilajacket / my_rails_app / foo / bar'
lautet
21

Sie können mit Variablen auf den Rails-App-Pfad zugreifen RAILS_ROOT.

Zum Beispiel:

render :file => "#{RAILS_ROOT}/public/layouts/mylayout.html.erb"
Anubhaw
quelle
2
RAILS_ROOT wird beraubt, da Rails 3.0 die Verwendung von Rails.root installiert hat
vidur punj
15

Zusätzlich zu all den anderen richtigen Antworten funktioniert dies nicht , da Rails.rootes sich um ein PathnameObjekt handelt:

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

Sie könnten so etwas wie gebrauchen join

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

Wenn Sie eine Zeichenfolge möchten, verwenden Sie diese:

Rails.root.join('app', 'assets').to_s
Andrew
quelle
1
Eigentlich Rails.root + 'app/assets' funktioniert , aber ja joinist ordentlicher.
Mischa
1
Es ist normalerweise keine gute Idee, das Dateitrennzeichen (\ oder /) fest zu codieren.
Alexander Bird
5

In einigen Fällen möchten Sie möglicherweise das Rails-Stammverzeichnis, ohne Rails laden zu müssen.

Zum Beispiel erhalten Sie einen schnelleren Feedback-Zyklus, wenn Sie TDD-Modelle, die nicht von Rails abhängen, spec_helperanstelle von benötigen 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

Auf diese Weise können Sie ganz einfach alte Ruby-Objekte aus ihren Spezifikationsdateien laden.

# spec/models/poro_spec.rb

require 'spec_helper'

require 'poro'

RSpec.describe ...
Dennis
quelle
0

Sie können verwenden:

Rails.root

Um sich den Assets anzuschließen, können Sie Folgendes verwenden:

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

Hoffentlich hilft dir das.

Ali Hassan Mirza
quelle
-2

Einfach von Rails.root oder wenn Sie etwas anhängen möchten, können wir es wie Rails.root.join ('App', 'Assets'). To_s verwenden

Amit
quelle
Bitte löschen Sie diese Antwort, es ist nur Lärm, fügt der Frage nichts hinzu.
luk2302
-5

Einfach durch Schreiben von Rails.root und Anhängen von Rails.root.join (*% w (App-Assets)). To_s

sumit
quelle
1
Bitte löschen Sie diese Antwort, sie ist nur Rauschen, fügt der Frage nichts hinzu und ist schlecht formatiert.
luk2302