Объекты ActiveRecord не работают в обратных вызовах EventMachine

Я столкнулся со следующей проблемой при тестировании моего приложения Rails.

При выполнении асинхронного HTTP-запроса с помощью EventMachine я по какой-то причине не могу использовать объекты ActiveRecord в обратном вызове. Всякий раз, когда я пытаюсь получить доступ к объекту, я получаю следующее исключение:

/home/user/.rvm/gems/ruby-1.8.7-p371/gems/activerecord-2.3.18/lib/active_record/attribute_methods.rb:144:in `create_time_zone_conversion_attribute?': You have a nil object when you didn't expect it! (NoMethodError)
You might have expected an instance of Array.
The error occurred while evaluating nil.include?
from /home/user/.rvm/gems/ruby-1.8.7-p371/gems/activerecord-2.3.18/lib/active_record/attribute_methods.rb:75:in `define_attribute_methods'
from /home/user/.rvm/gems/ruby-1.8.7-p371/gems/activerecord-2.3.18/lib/active_record/attribute_methods.rb:71:in `each'
from /home/user/.rvm/gems/ruby-1.8.7-p371/gems/activerecord-2.3.18/lib/active_record/attribute_methods.rb:71:in `define_attribute_methods'
from /home/user/.rvm/gems/ruby-1.8.7-p371/gems/activerecord-2.3.18/lib/active_record/attribute_methods.rb:257:in `method_missing'

Если я удаляю объекты ActiveRecord из обратного вызова, все работает нормально. К сожалению, мне действительно нужно, чтобы они были доступны, поэтому удаление не вариант.

Неважно, обращаюсь ли я к объекту для чтения или записи.

Код, который я написал, выглядит примерно так:

http = EM::HttpRequest.new(url).get(:query => query)

http.callback do
  ....
  object.status = 'delivered'
  object.save!
  ....
end

Что касается среды, у меня есть следующие настройки:

  • Убунту 12.04 ЛТС
  • Рубин 1.8.7-p371
  • Рельсы 2.3.18
  • Тонкий сервер 1.5.0
  • АктивРекорд 2.3.18
  • EventMachine 1.0.0

Кто-нибудь знает, что может быть причиной этой ошибки? Как это исправить?

Заранее спасибо!


person dominos    schedule 25.05.2013    source источник
comment
Можете ли вы показать, как вы получаете «объект»?   -  person Sergii Mostovyi    schedule 27.05.2013


Ответы (1)


Кажется, все, что мне нужно было сделать, это изменить файл конфигурации разработки. Установка config.cache_classes = true устранила проблему.

person dominos    schedule 08.06.2013
comment
Это безумие, я должен поддерживать какой-то устаревший проект Rails 2.3. Вы знаете, почему у нас есть эта ошибка в первую очередь? - person BlackTea; 16.01.2018
comment
К сожалению нет. Поскольку это исправление сработало хорошо, мне не нужно было копать дальше. - person dominos; 18.01.2018
comment
Да, но во время разработки нам нужно перезапускать сервер каждый раз, когда мы вносим изменения. Или вы знаете лучший способ? - person BlackTea; 18.01.2018
comment
Да, вы должны перезапустить его после изменений с cache_classes, установленным в true. Но для меня это никогда не было проблемой, так как перезагрузка занимает всего несколько секунд и не требуется очень часто. - person dominos; 25.01.2018