2009-08-03 18 views
58

Was ist der richtige Weg, um aus Rails 2.3 ein Verzeichnis zu dem Ladepfad hinzuzufügen, so dass es sich in die automatischen Lademechanismen von Rails einklinkt? Das konkrete Beispiel, an das ich denke, ist, dass ich eine Klasse habe, die mehrere Unterklassen mit STI verwendet, und ich dachte, es wäre eine gute Idee, sie in ein Unterverzeichnis zu legen, anstatt die oberste Ebene zu durcheinander zu bringen. So hätte ich so etwas wie:Hinzufügen eines Verzeichnisses zum Ladepfad in Rails?

#app/models/widget.rb 
class Widget < ActiveRecord::Base 
    add_to_load_path File.join(File.dirname(__FILE__), "widgets") 
end 

#app/models/widgets/bar_widget.rb 
class BarWidget < Widget 
end 

#app/models/widgets/foo_widget.rb 
class FooWidget < Widget 
end 

Es ist die add_to_load_path Methode, die ich suche.

Antwort

60

Für ältere Versionen von Rails:

Sie dies in Ihrer environment.rb Config-Datei tun. BLOCK-- kein Zugriff auf Config Objekt

Für Rails 3 finden Sie Antworten

+8

ActiveSupport :: Abhängigkeiten.autoload_pfade << "# {RAILS_ROOT}/app/widgets" –

+1

Siehe Antwort von Pocket-Full-of-Viertel, die tatsächlich korrekt ist. Dieser ist jetzt veraltet. – micapam

1

unten Ich fand ich diese nach Config tun musste mehr -

config.load_paths << "#{RAILS_ROOT}/app/widgets" 

.

Dies hat den Trick

ActiveSupport::Dependencies.load_paths << "#{RAILS_ROOT}/app/widgets" 
27

In Rails 3 können Sie diese in config/application.rb gesetzt, wobei diese Probe standardmäßig zur Verfügung gestellt:

# Add additional load paths for your own custom dirs 
# config.load_paths += %W(#{config.root}/extras) 
+13

# config.autoload_paths + =% W (# {config.root}/Extras) – tamersalama

8

Ein weiteres Update für Schienen 3 - Active 3.0.0:

Statt:

ActiveSupport::Dependencies.load_paths << "#{RAILS_ROOT}/app/widgets" 

Möglicherweise müssen Sie dies tun:

ActiveSupport::Dependencies.autoload_paths << "#{RAILS_ROOT}/app/widgets" 
+2

Rails.root ist notwendig, in Rails 3 statt RAILS_ROOT –

+0

Unter Rails 3.0.3 hatte ich Active verwenden :: Dependencies.autoload_paths + =% W (# {Rails.root.to_s}/app/libs) –

101

In der aktuellen Version von Rails (3.2.8), dies wurde in der application.rb Datei geändert.

Der Code wird zur Zeit kommentiert, wie:

# Custom directories with classes and modules you want to be autoloadable. 
    # config.autoload_paths += %W(#{config.root}/extras) 

Wird die autoload_paths Wert zu aktualisieren. Der Versuch, die vorherige Variable load_paths zu ändern, verursacht diesen Fehler.

/configuration.rb:85:in `method_missing': undefined method `load_paths' for #<Rails::Application::Configuration:0xac670b4> (NoMethodError) 

für ein Beispiel, für jeden Pfad config zu autoload_paths hinzuzufügen, eine Linie ähnlich den folgenden hinzuzufügen:

config.autoload_paths += %W(#{config.root}/app/validators) 

config.autoload_paths eine Anordnung von Pfaden, von denen akzeptiert Konstanten Willen automatische Laden Schienen . Standardmäßig sind alle Verzeichnisse unter app.

http://guides.rubyonrails.org/configuring.html


Von commentor (Hakunin) unter:

Wenn das Verzeichnis unter app/ ist, Sie brauchen es nicht überall hinzufügen, es sollte nur standardmäßig arbeiten (auf jeden Fall in 3.2.12). Rails hat eager_load_paths, die als autoload_paths in Entwicklung und eifrige Auslastung in der Produktion fungiert. Alle app/* Verzeichnisse werden dort automatisch hinzugefügt.

+1

Sie beantworten eine 3 Jahre alte Frage, und Rails 3 gab es nicht, als diese Frage gestellt wurde – Bassetassen

+78

Bro, Sie kennen die Suchmaschine Google, es listet 3 Jahre alte Suchergebnisse auf - die ganze Zeit. Wäre es nicht schön, wenn das 3 Jahre alte Ergebnis Ihre Frage beantworten und Ihre Suche früher beenden könnte? –

+0

Natürlich, aber diese Frage hat bereits eine akzeptierte Antwort, so dass der Fragesteller bereits eine Antwort auf seine Frage bekommen hat. – Bassetassen

8

On Rails 5 müssen Sie den folgenden Code hinzufügen environment.rb:

# Add the widgets folder to the autoload path 
Rails.application.configure do 
    config.autoload_paths << "#{Rails.root}/app/widgets" 
end 
+1

Rails 5 lädt automatisch alle Ordner im App-Verzeichnis. –

+0

Danke. Dies war das Standardverhalten beim letzten Mal, das ich überprüft habe, aber ehrlich gesagt kann ich mich nicht erinnern, ob es sich um ein Produktionsproblem handelte, wie es hier beschrieben wird: http://blog.bigbinary.com/2016/08/29/rails-5-disables -autoloading-nach-boot-the-app-in-production.html –

7

In Rails 5 Sie laden müssen nicht explizit Ordner aus dem App-Verzeichnis mehr. Alle darin platzierten Ordner sind direkt verfügbar. Sie müssen keine der Konfigurationsdateien berühren. Aber es scheint, als gäbe es einige Probleme mit Spring.

Der neue Workflow ist daher:

  1. einen neuen Ordner und Klasse mit bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths' auf der Kommandozeile
  2. Lauf spring stop auf der Kommandozeile
  3. Prüfung, welche die Autoload-Pfade innerhalb des/app-Verzeichnis erstellen . Der neue Ordner sollte jetzt aufgelistet sein.
  4. Lauf spring start auf der Kommandozeile
+0

Ich finde diese unzuverlässig und ich hatte nie Frühling installiert oder in meinem gemfile (wenn ausgeführt). Mit unzuverlässig meine ich, dass der Puts-Code das Verzeichnis findet, aber keine der darin enthaltenen Dateien geladen wird, um sie an anderer Stelle einzufügen. Das Einbinden von Klassen funktioniert für mich, wenn ich den autoload_path stattdessen in die config/application.rb stelle. – Mirv

+0

@Mirv - auf welcher Schienenversion bist du? und siehe: http://guides.rubyonrails.org/autoloading_and_loading_constants.html#autoload-paths –

+0

Ja, ich lese diese und dann getestet auf Schienen 5.0.0 und 5.1.0 in der IDE von Cloud9. Es funktioniert anscheinend nicht wie normale Änderungen an den Dateien beim Ausführen von 'rails s', sondern stattdessen muss ich' reload! 'In' rails c' hochladen, was für drei weitere Abschnitte der Dokumentation nicht erwähnt wird! Ich ging zurück und überprüfte, genau wie es für mein Projekt steht - ich muss die Datei manuell hinzufügen, obwohl sie sich in app/classes/fillers.rb befindet, während ich 'rails c' benutze ... Ich habe sogar den Arbeitsbereich neu gestartet Ich habe kein komplett neues Projekt begonnen. – Mirv

2

In config/application.rbconfig.autoload_path << "#{config.root}/dir/widgets"

Datei hinzufügen sollte wie folgt aussehen:

module MyApp 
    class Application < Rails::Application 
    config.autoload_paths << "config.root}/widgets" 
    end 
end 

Ich weiß, das auch für Rails 4 und 5. Wahrscheinlich andere Werke .

Verwandte Themen