Die Magie des automatischen Ladens von Sachen
Ich denke, die Option, die Ordner zu steuern, aus denen das automatische Laden durchgeführt wird, wurde in anderen Antworten ausreichend behandelt. Falls jedoch jemand anderes Probleme beim Laden hat, obwohl die Autoload-Pfade nach Bedarf geändert wurden, versucht diese Antwort zu erklären, was die Magie hinter diesem Autoload-Ding ist.
Wenn es darum geht, Inhalte aus Unterverzeichnissen zu laden, gibt es eine Gotcha oder eine Konvention, die Sie beachten sollten. Manchmal kann die Ruby / Rails-Magie (diesmal meistens Rails) es schwierig machen zu verstehen, warum etwas passiert. Jedes in den Autoload-Pfaden deklarierte Modul wird nur geladen, wenn der Modulname dem Namen des übergeordneten Verzeichnisses entspricht. Für den Fall, dass Sie versuchen, lib/my_stuff/bar.rb
etwas zu tun wie:
module Foo
class Bar
end
end
Es wird nicht automatisch geladen. Wenn Sie das übergeordnete Verzeichnis foo
so umbenennen, dass Ihr Modul unter folgendem Pfad gehostet wird : lib/foo/bar.rb
. Es wird für Sie da sein. Eine andere Möglichkeit besteht darin, die Datei, die automatisch geladen werden soll, anhand des Modulnamens zu benennen. Offensichtlich kann es dann nur eine Datei mit diesem Namen geben. Falls Sie Ihre Daten in viele Dateien aufteilen müssen, können Sie diese eine Datei natürlich verwenden, um andere Dateien zu benötigen. Ich empfehle dies jedoch nicht, da Rails im Entwicklungsmodus und wenn Sie diese anderen Dateien ändern, nicht in der Lage ist, automatisch zu arbeiten lade sie für dich neu. Wenn Sie jedoch wirklich möchten, können Sie eine Datei mit dem Modulnamen haben, die dann die tatsächlichen Dateien angibt, die für die Verwendung des Moduls erforderlich sind. Sie könnten also zwei Dateien haben: lib/my_stuff/bar.rb
und lib/my_stuff/foo.rb
die erste ist dieselbe wie oben und die zweite enthält eine einzelne Zeile:require "bar"
und das würde genauso funktionieren.
PS Ich fühle mich gezwungen, noch eine wichtige Sache hinzuzufügen. Wenn ich in letzter Zeit etwas im lib-Verzeichnis haben möchte, das automatisch geladen werden muss, neige ich dazu zu denken, dass es eines Tages etwas sein könnte, das ich speziell für dieses Projekt entwickle (was es normalerweise ist) verwandeln Sie sich in einen "statischen" Codeausschnitt, der in vielen Projekten oder in einem Git-Submodul usw. verwendet wird. In diesem Fall sollte er sich definitiv im lib-Ordner befinden. Dann befindet sich sein Platz möglicherweise überhaupt nicht im lib-Ordner. Vielleicht sollte es sich in einem Unterordner unter dem App-Ordner befinden. · Ich habe das Gefühl, dass dies die neue Art und Weise ist, Dinge zu tun. Offensichtlich ist die gleiche Magie überall dort wirksam, wo Sie in Ihren Autoload-Pfaden Ihre Sachen ablegen, damit es gut für diese Dinge ist. Jedenfalls sind dies nur meine Gedanken zu diesem Thema. Es steht Ihnen frei, anderer Meinung zu sein. :) :)
UPDATE: Über die Art der Magie ..
Wie Severin in seinem Kommentar betonte, ist der Kern "Autoload a Module Mechanism" sicher ein Teil von Ruby, aber das Autoload Paths-Zeug ist es nicht. Sie brauchen keine Rails zu tunautoload :Foo, File.join(Rails.root, "lib", "my_stuff", "bar")
. Und wenn Sie zum ersten Mal versuchen würden, auf das Modul Foo zu verweisen, wird es für Sie geladen. Rails bietet uns jedoch die Möglichkeit, Inhalte automatisch aus registrierten Ordnern zu laden. Dies wurde so implementiert, dass etwas über die Namenskonventionen vorausgesetzt werden muss. Wenn es nicht so implementiert worden wäre, müsste es jedes Mal, wenn Sie auf etwas verweisen, das gerade nicht geladen ist, alle Dateien in allen Autoload-Ordnern durchsuchen und prüfen, ob eine von ihnen das enthält, worauf Sie verweisen wollten. Dies würde wiederum die Idee des automatischen Ladens und automatischen Ladens zunichte machen. Mit diesen Konventionen kann es jedoch von dem Modul / der Klasse abziehen, dass Sie versuchen, dort zu laden, wo dies definiert sein könnte, und dies einfach laden.
app/lib
.