1

クライアントが新しいレコードを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 }

4

2 に答える 2

0

入念な調査の結果、問題の原因と修正方法を突き止めることができましたが、なぜこれが発生しているのかわかりません。それでも、今のところブロックを解除しているので、それで十分です。

上記のコードでは、

# <figure out some stuff here> 

ブロック。適切だとは思わなかったので、元の質問で抽象化したコードがありました。だったことがわかりました。具体的には、文字列の連結を行っていた行がありました。

some_string << @foo.somestringfield

この一行は、何らかの理由で、

related.update_attributes(stuff) 

データベースに保存しないでください。これは100%再現可能でした(私を信じてください、確かにそれを約10回テストしました)。修正は簡単でした:

some_string = some_string + @foo.somestringfield

それは、真剣に、問題を修正しました。私は根本的な原因を特定するためにルビー内のインプレース連結の内臓を深くデバッグしませんでしたが、他の誰かがこの問題に遭遇した場合は、今あなたは知っています。

于 2012-09-22T04:47:41.553 に答える
0

一般に、この動作(update_attributesローカルでは保存されますが、Herokuでは保存されません)は、への呼び出し内で関数を実行していないことを確認することでトラブルシューティングできるようですupdate_attributes

私にとって、callingupdate_attributes(:heartbeat => Time.now)はローカルで機能し、Herokuを節約できませんでした。上記の答えを使用して、Time.nowupdate_attributesを呼び出す前に変数に保存することで、推測して問題を解決しました。

heartbeat = Time.now
thing.update_attributes(:heartbeat => heartbeat)

このコードはHerokuに正しく保存されました。これはコメントであるはずですが、評判のルールにより、私は「答えています」。

于 2016-03-31T15:40:12.710 に答える