我有一个简单的 Rails Web 服务,它公开了一个允许客户端发布新记录的 JSON API。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
我认识到这是一个糟糕的两阶段提交模式,它滥用了典型的 REST 模型,但我继承了这段代码。我最终会修复它;这都是分阶段“修复”计划的一部分。
此代码在本地测试盒上完美运行。当部署到 Heroku 时,我进行了调试,显示模型在调用 update_attributes 后显然正在更新。但是,不知何故,模型实际上并没有更新。当我之后使用网页检查“相关”记录时,它们都没有通过“东西”更改进行更新。我对此感到非常困惑,因为调试喷出似乎显示正在更新的记录。有什么见解吗?
更新
当我回顾调试时,我刚刚注意到的一件事是 updated_at 日期时间永远不会改变,即使记录中的字段似乎有。您可以从下面的行中看到,该呼叫是在 UTC 时间 8:04:15 左右进行的。此外,我验证了 update_attributes 返回 true,所以据我所知没有错误。
在调用 update_attributes 之前:
←[36m2012-09-20T08:04:15+00:00 app[web.1]:←[0m { "created_at"=>Thu, 20 Sep 2012 00:43:45 UTC +00:00, "somefield" =>"" , "id"=>2, "updated_at"=>2012 年 9 月 20 日星期四 06:22:07 UTC +00:00 }
调用 update_attributes 后:
←[36m2012-09-20T08:04:15+00:00 app[web.1]:←[0m { "created_at"=>Thu, 20 Sep 2012 00:43:45 UTC +00:00, "somefield" =>"10000848364" , "id"=>2, "updated_at"=>2012 年 9 月 20 日星期四 06:22:07 UTC +00:00 }