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