2009-06-13 16 views
5

W środowisku programistycznym szyn, cache_classes jest wyłączony, więc można zmodyfikować kod pod app/ i zobaczyć zmiany bez restartowania serwera.Jak korzystać z obiektów domeny z oprogramowania pośredniego z opcją cache_classes?

We wszystkich środowiskach oprogramowanie pośrednie jest tworzone tylko raz. Więc jeśli mam middleware takiego:

class MyMiddleware 

    def initialize(app) 
    @app = app 
    end 

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

end 

i zrobić to w config/environments/development.rb:

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

wtedy będę zawsze pojawia się następujący błąd:

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' 
    ... 

Problem polega na tym, że Instancja MyMiddleware jest tworzona tylko raz podczas ładowania systemu, ale klasa MyModel jest ponownie ładowana podczas każdego połączenia.

Próbowałem 'MyModel'.constantize.first opóźnić wiązanie do klasy aż metoda wywołania czasie, ale to zmienia problem na nowy:

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' 
    ... 

Odpowiedz

2

Wydaje się to być błąd Rails. Sprawdź, czy możesz uaktualnić swoją wersję Railsów do wersji 2.3.4 lub 2.3.5.

Wierzę, że this to zatwierdzenie, które naprawiło problem. Oryginalny raport o błędzie to here.

-1

Znaleźliśmy jakiś problem podobny do twojego. O ile pamiętam, można to naprawić, ustawiając time_zone w environment.rb na: utc. To było jakiś czas temu i nie pamiętam dokładnie nazwy parametru konfiguracyjnego ani czy był to "UTC" czy: utc. Spróbuj, może to pomoże.

Powiązane problemy