Schienen nicht in der Lage, um die autoload-Konstante aus Datei trotz der angegebenen Datei
Dies ist eine knifflige Sache zu erklären. Ich habe ein Modul in einem anderen Modul-namespace wie folgt:
# app/models/points/calculator.rb
module Points
module Calculator
def self.included(base)
base.send(:include, CommonMethods)
base.send(:include, "Points::Calculator::#{base}Methods".constantize)
end
end
end
Also dann in andere Klassen alles, was ich zu tun ist:
class User
include Points::Calculator
end
Habe ich diese angegeben Verzeichnis in der Anwendung.rb zu autoloadable...(obwohl ich denke, Schienen eine Rekursion durch Modelle...)
config.autoload_paths += Dir[ Rails.root.join('app', 'models', "points") ]
In der Entwicklung env, funktioniert alles einwandfrei. Bei der Ausführung von tests(und die Produktion env), bekomme ich die folgende Fehlermeldung:
Unable to autoload constant Points::Calculator, expected /Users/pete/work/recognize/app/models/points/calculator.rb to define it (LoadError)
Ich tatsächlich folgte dem Rat hier, um das problem zu beheben: Stop Schienen von der Entleerung ein Modul in Entwicklung Modus, indem Sie explizit erfordern Taschenrechner.rb in der Anwendung.rb.
Jedoch, warum ist das passiert??
Steckte ich einige debug-Ausgabe in ActiveSupport Abhängigkeiten.rb-Datei und bemerkt, dass diese Datei wird doppelt gefordert. Das erste mal Ihre benötigte ich kann sehen, dass die Konstante ist in der Tat geladen.
Aber das 2. mal benötigten die ständige entladen wurde so weit wie Schienen sagen kann, aber wenn das eigentliche verlangen ist aufgerufen, ruby gibt false zurück, da ruby kennt Ihr bereits gefordert wurde. Dann Schienen wirft, die "nicht in der Lage, um die autoload-Konstante" - Fehler, weil die Konstante noch nicht vorhanden ist, und ruby hat nicht "re-verlangen" wird die Datei.
Kann jemand werfen Licht auf, warum dies geschehen könnte?
- Tut das entfernen von Punkten aus dem verloren autoloadable Wege helfen? Es sollte nicht nötig sein
- Ja, ich habe es versucht mit und ohne in der autoload Pfad. Gleiche problem.
- Scheinen mit dem gleichen problem. Sehr ärgerlich, müssen Sie die Klasse, da habe ich über 30+ solche Klassen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schienen ergänzt die Konstante lookup-Mechanismus von ruby.
Konstante lookup in Ruby:
Ähnlich
method missing
eineModule#constant-missing
wird aufgerufen, wenn eine Referenz auf eine Konstante nicht gelöst. Wenn wir beziehen sich auf eine Konstante, die in einem gegebenen lexikalischen Umfang, dass es der ständigen gesucht:Wenn wir auf eine Konstante, Ruby ersten versuche finden Sie nach diesem built-in-lookup-Regeln.
Wenn ruby nicht finden... Schienen kicks in, und mit
its own lookup convention
und seine Kenntnisse über die Konstanten, die bereits geladen wurden (von ruby), Schienen überschreibtModule#const_missing
zu laden fehlt Konstanten, ohne die Notwendigkeit für explizite erfordern, ruft der Programmierer.Eigene lookup-Konvention?
Kontrastierenden Ruby autoload (erfordert die Lage der einzelnen geladen Konstanten werden im Voraus angegeben werden) Schienen nach einer Konvention, die Karten Konstanten Dateinamen.
Nun für die Konstante Punkte::Taschenrechner, Schienen sucht in dieser Datei-Pfad (dh 'Punkte/Rechner.rb') innerhalb der autoload-Pfade, definiert durch die
autoload_paths
Konfiguration.In diesem Fall Schienen gesucht Dateipfad
points/calculator
in seiner geladen Pfade, allerdings nicht die Datei suchen und damit dieser Fehler/Warnung wird angezeigt.Diese Antwort ist ein Auszug aus dieser Urbanautomation blog.
Calculator
sollte ein Klasse werden geladen richtiglib
Verzeichnis stattapp/models
app/models/concerns
ist wahrscheinlich der beste Platz für Sie.