Обектите на 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

Що се отнася до средата, имам следната настройка:

  • Ubuntu 12.04 LTS
  • Ruby 1.8.7-p371
  • Релси 2.3.18
  • Тънък сървър 1.5.0
  • ActiveRecord 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