2009-06-13 1 views
5

In der Rails-Entwicklungsumgebung ist cache_classes deaktiviert, sodass Sie den Code unter app/ ändern und Änderungen anzeigen können, ohne den Server neu zu starten.Wie verwende ich Domänenobjekte aus der Middleware mit deaktivierten Cache-Klassen?

In allen Umgebungen wird Middleware jedoch nur einmal erstellt. Also, wenn ich Middleware wie diese:

class MyMiddleware 

    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    env['model'] = MyModel.first 
    end 

end 

und ich tue dies in config/environments/development.rb:

config.cache_classes = false # the default for development 
config.middleware.use MyMiddleware 

dann werde ich immer folgende Fehlermeldung erhalten:

A copy of MyMiddleware has been removed from the module tree but is still active! 
    /Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:414:in `load_missing_constant' 
    /Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:96:in `const_missing' 
    /Users/me/projects/my_project/lib/my_middleware.rb:8:in `call' 
    /Library/Ruby/Gems/1.8/gems/actionpack-2.3.2/lib/action_controller/middleware_stack.rb:72:in `new' 
    ... 

Das Problem ist, dass Die MyMiddleware Instanz wird einmal zur Systemladezeit erstellt, die Klasse MyModel wird jedoch bei jedem Aufruf erneut geladen.

Ich versuchte 'MyModel'.constantize.first bis Methode Bereitschaftszeit zur Klasse verbindlich zu verzögern, aber das ändert sich das Problem auf eine neue:

You have a nil object when you didn't expect it! 
The error occurred while evaluating nil.include? 
    /Library/Ruby/Gems/1.8/gems/activerecord-2.3.2/active_record/attribute_methods.rb:142in `create_time_zone_conversion_attribute?' 
    /Library/Ruby/Gems/1.8/gems/activerecord-2.3.2/active_record/attribute_methods.rb:75:in `define_attributes_methods' 
    ... 

Antwort

2

Dies scheint ein Rails Bug zu sein. Sehen Sie, ob Sie Ihre Rails-Version auf 2.3.4 oder 2.3.5 aktualisieren können.

Ich glaube this ist das Commit, das das Problem behoben. Ursprünglicher Fehlerbericht ist here.

-1

Wir haben vor einiger Zeit auf ein ähnliches Problem gestoßen. Soweit ich mich erinnere, könnte dies behoben werden, indem time_zone in environment.rb auf: utc gesetzt wird. Es war eine Weile her und ich erinnere mich nicht genau an den Namen des Config-Parameters oder ob es 'UTC' oder: utc war. Probieren Sie es aus, vielleicht wird es helfen.

Verwandte Themen