Ich lege einen Dateinamen g.rb in den Seitenordner. Rails.root/lib
Der Dateiinhalt ist wie folgt:
module Google
end
Dann füge ich hinzu
config.autoload_paths += %W(#{config.root}/lib #{Rails.root}/app/delayed_jobs)
zu meinem Rails.root/config/application.rb
Wenn ich jedoch versuche, Google von aufzurufen rails console
, wird eine Ausnahme ausgelöst. Die Ausnahme verschwindet nur, wenn ich ausführe require 'google'
. Warum? Sollte meine Datei nicht automatisch geladen werden und sollte ich nicht ohne zusätzliche require
Anweisung auf das Modul zugreifen ?
quelle
Ich hatte ein ähnliches Problem damit, mein Modul auf Heroku laufen zu lassen. Zusätzlich zu der von Stephen C angegebenen Autoload-Namenskonvention stellte ich fest, dass der Modulcode
require
aufgrund einerthreadsafe
Annahme der Rails-Produktionsumgebung auf Heroku erstellt werden muss (obwohl diesthreadsafe
in meinerproduction.rb
Konfigurationsdatei auskommentiert wurde) Da ichrequire
die Moduldatei vor dem Aufrufeninclude
des Moduls erstellt hatte, begann alles zu funktionieren.require 'mymodule' include Mymodule
Bitte werfen Sie einen Blick auf diesen ausgezeichneten Artikel zum Thema, dass Module in Heroku (Produktion) korrekt geladen werden.
quelle
Das liegt daran, dass beim Autoload nicht alles im Voraus "verlangt" werden muss (Startstrafe). Klassen werden nach Bedarf geladen / referenziert. Dazu müssen Sie wissen, wo Sie nach der Klasse suchen müssen. Andernfalls müssten Sie jede Datei im Autoload-Verzeichnis im Voraus laden, um zu sehen, welche Klassen deklariert sind. Es ist ein Kompromiss, aber alles im Voraus zu verlangen (wie Marbaq vorschlägt), ist kein automatisches Laden. Sie können den von Ruby bereitgestellten Befehl autoload verwenden, der zwei Argumente verwendet, das zu ladende Modul (symbolisiert, dh in Ihrem Fall Google), und das zweite Argument ist der Dateiname, der g.rb wäre, wenn sich lib in Ihrem befindet Ladepfad ($ :). Informationen zum automatischen Laden finden Sie in den Ruby-Dokumenten.
quelle
Wechseln Sie
config.autoload_paths
zuconfig.eager_load_paths
(basierend auf Rails-Problem Nr. 6850 und Force Reload! aus dem lib-Verzeichnis in der Rails 3.2-Konsole )
quelle
Ich hatte gerade das gleiche Problem und meine "Lösung" (oder besser gesagt die Problemumgehung) bestand darin, jede benötigte Datei von Rails.root / lib in meiner application.rb manuell anzufordern.
require 'lib/message' require 'lib/store' require 'lib/vault/vault.rb' require 'lib/custom_loggers' module MyApplication class Application < Rails::Application
Mein nächster Schritt wäre, die Dateien in Modulordnern zu kategorisieren, wie Sie erwähnen.
quelle
Ich habe diese Lösung vor kurzem gefunden
config / application.rb
module AppName class Application < Rails::Application # Custom directories with classes and modules you want to be autoloadable. config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')] config.autoload_paths += Dir[Rails.root.join('app', 'lib', 'extensions')] end end
Der erste Konfigurationsaufruf veranlasst Rails, alle Unterverzeichnisse des Verzeichnisses app / models automatisch zu laden, sodass ich jetzt /app/models/sub_directory/model.rb automatisch laden kann (praktisch zum Organisieren einer App mit einer großen Codebasis).
Der zweite Konfigurationsaufruf veranlasst Rails, das Verzeichnis lib / extensions automatisch zu laden
hoffe das hilft
Hinweis: Ich glaube, dies ist Rails 3 spezifisch
quelle