Rails アプリをテストしているときに、次の問題に遭遇しました。
EventMachine で非同期 HTTP リクエストを作成すると、何らかの理由でコールバックで 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
- ルビー 1.8.7-p371
- レール 2.3.18
- シンサーバー 1.5.0
- アクティブレコード 2.3.18
- イベントマシン 1.0.0
このエラーの原因を知っている人はいますか? これを修正する方法は?
前もって感謝します!