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.
InformationsquelleAutor Peter P. | 2014-07-03
Schreibe einen Kommentar