Как мне использовать доменные объекты из промежуточного программного обеспечения с отключенными cache_classes?
-
13-09-2019 - |
Вопрос
В среде разработки rails, cache_classes
выключен, так что вы можете изменять код в app/
и увидеть изменения без перезапуска сервера.
Однако во всех средах промежуточное программное обеспечение создается только один раз.Итак, если у меня есть промежуточное программное обеспечение, подобное этому:
class MyMiddleware
def initialize(app)
@app = app
end
def call(env)
env['model'] = MyModel.first
end
end
и я делаю это в config/environments/development.rb
:
config.cache_classes = false # the default for development
config.middleware.use MyMiddleware
тогда я всегда буду получать следующую ошибку:
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'
...
Проблема в том, что MyMiddleware
экземпляр создается один раз во время загрузки системы, но MyModel
класс перезагружается при каждом вызове.
Я пытался 'MyModel'.constantize.first
отложить привязку к классу до времени вызова метода, но это меняет проблему на новую:
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'
...
Другие советы
Некоторое время назад мы столкнулись с проблемой, похожей на вашу.Насколько я помню, это можно было бы исправить, установив time_zone в environment.rb равным :utc.Это было некоторое время назад, и я не помню точно имя параметра конфигурации или было ли это "UTC" или :utc.Попробуйте, может быть, это поможет.