2014-05-12 2 views
9

Ich schrieb benutzerdefinierte Instrumentierung in meiner Rails-Anwendung. Ermogliche es in config/initializers/instrumentation.rb-Datei wie folgt:Rails Klassen neu laden und 'wurde aus dem Modulbaum entfernt, ist aber noch aktiv!' ArgumentError

ActiveSupport.on_load(:action_controller) do 
    include FooBar::ControllerRuntime 
end 

Aber dies führt mich zu Fehlern A copy of FooBar::ControllerRuntime has been removed from the module tree but is still active!. Ich kann es herausfinden, dass ich es auf zwei Arten lösen:

  • Pfad Hinzufügen wo kann ‚FooBar :: ControllerRuntime is defined to config.autoload_one_paths`
  • :to_prepare Rückruf in ActionController::Railtie

Zweite Lösung Aussehen definieren wie folgt:

Diese lange Einführung führt zu der Frage: welcher Weg ist besser? Mit dem ersten deaktiviere ich das Nachladen von Klassen, die auf dem gleichen Pfad liegen wie meine FooBar::ControllerRuntime. Mit der Sekunde fühle ich nicht, dass es gut ist, mit ActionController::Railtie zu verwirren. Richtig wissen ActionController::Railtie hat nicht definiert to_prepare aber was passiert, wenn in der nächsten Version wird es haben?

Antwort

4

Der erste Ansatz sieht cleaner -

Hinzufügen Pfad, in dem möglicherweise ‚FooBar :: ControllerRuntimeis definiert toconfig.autoload_one_paths`

Gründe -

1) Wenn Sie wirklich wollen, tun einige Affen Patches in der Datei wie lib/extensions.rb, können Sie es manuell anfordern:

in co nfig/initializers/require.rb:

erfordern "# {Rails.root}/lib/extensions"

2) Folgt richtige Namenskonventionen, wie Sie die Klasse und Modul Liste unten müssen.

Ich würde nicht vorschlagen automatisches Laden für die Produktionsanwendung obwohl, aber wenn es die letzte Option ist, als Sie es sicherlich ausprobieren können.

Gut lesen Sie hier auf dem gleichen - http://www.williambharding.com/blog/technology/rails-3-autoload-modules-and-classes-in-production/