クライアントが新しいレコードをPOSTできるようにするJSONAPIを公開する単純なRailsWebサービスがあります。POSTが処理されると、最初に参照レコードが作成されますが、同時にいくつかの関連レコードも更新されます。
@foo = Foo.new(foo_params)
if @foo.save
related_list = Foo.where(:some_id => foo_params[:list])
related_list.each do |related|
# <figure out some stuff here>
related.update_attributes(stuff)
end
# debug spew
@test = Foo.find(a_related_record_id)
puts @test.as_json
format.json { render json: @foo.as_json }
end
これは悪い2フェーズコミットパターンであり、一般的なRESTモデルを悪用していることを認識していますが、このコードを継承しました。最終的には修正します。これはすべて段階的な「修正」計画の一部です。
このコードは、ローカルのテストボックスで完全に機能します。Herokuにデプロイするときに、update_attributesが呼び出された後にモデルが明らかに更新されていることを示すデバッグスピューを配置しました。しかし、どういうわけか、モデルは実際には更新されていません。後でウェブページを使って「関連する」レコードをチェックすると、「もの」の変更で更新されたものはありません。デバッグスピューが更新されているレコードを示しているように見えるので、私はこれにかなり困惑しています。洞察はありますか?
アップデート
デバッグスピューを調べたときに気付いたのは、レコードのフィールドに変更があるように見えても、updated_at日時は変更されないということです。以下の行から、UTC8:04:15頃に電話がかけられたことがわかります。また、update_attributesがtrueを返していることを確認したので、私が知る限りエラーはありませんでした。
update_attributesが呼び出される前:
←[36m2012-09-20T08:04:15 + 00:00app [web.1]:←[0m {"created_at"=>2012年9月20日木曜日00:43:45UTC+00:00、"somefield" => ""、 "id" => 2、"updated_at"=>2012年9月20日木曜日06:22:07UTC+00:00 }
update_attributesが呼び出された後:
←[36m2012-09-20T08:04:15 + 00:00app [web.1]:←[0m {"created_at"=>2012年9月20日木曜日00:43:45UTC+00:00、"somefield" => "10000848364"、 "id" => 2、"updated_at"=>2012年9月20日木曜日06:22:07UTC+00:00 }