Как использовать доменные объекты из промежуточного программного обеспечения с отключенными cache_classes? - PullRequest
6 голосов
/ 13 июня 2009

В среде разработки 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'
  ...

Ответы [ 2 ]

2 голосов
/ 11 января 2010

Это похоже на ошибку Rails. Посмотрите, сможете ли вы обновить версию Rails до 2.3.4 или 2.3.5.

Я считаю, это - это коммит, который решил проблему Оригинальный отчет об ошибке здесь .

0 голосов
/ 14 января 2010

Мы столкнулись с проблемой, подобной вашей, некоторое время назад. Насколько я помню, это можно исправить, установив time_zone в environment.rb в: utc. Это было некоторое время назад, и я не помню точно имя параметра конфигурации или было ли это «UTC» или: UTC Попробуйте, может быть, это поможет.

...