【发布时间】:2012-05-23 21:08:46
【问题描述】:
我已经看了一段时间了,目前不知所措。我已将问题缩小到与 JSON 相关,并且 JSON 似乎没有以清晰的格式发送。
我们之前使用的是 Rails 3.0.7(我将要描述的问题不存在)。我们需要升级 Rails 以利用一些新功能 - 但现在出现了这个问题。在这一点上,我几乎可以肯定这是一个简单的配置或其他东西,但我需要更多的关注。
我们正在使用 ActiveResource 对象,并且在设置对象的值并保存它(从而进行 PUT)时,我们会从远程 Web 服务返回 ab 403:Forbidden。这不是 Web 服务层的问题。
在创建新对象并进行 POST 时,我们会收到 409:Conflict 返回,因为它尝试使用默认值更新数据库 - 这意味着 json 数据没有到达服务 - 或者不清晰。
我的问题是这在 Rails 3.0.7 中有效,在 3.2.3(或我也尝试过的 3.1.3)中不再有效。我对 JSON 数据以外的建议持开放态度,但我很确定这就是问题所在。
我的 ActiveResource 模型有
self.format = :json
我的一个初始化程序文件中有以下内容:
ActiveResource::Base.include_root_in_json = false
ActiveSupport::JSON.backend = "json_gem"
感谢您的任何建议!
更新
我一直在使用 curl 进行测试并通过以下方式使其工作:
curl -H "Content-Type: application/json" -d "{\"userID\":\"xxx\", \"label\":\"doc.test.test\", \"value\":\"1,19\", \"id\":\"-1\"}" -v -X POST http://host:port/usermanagement/users/xxx/prefs
我得到了它的工作,但是
似乎必须明确设置 Content-Type 标头,否则会导致 415:Media Unrecognized 错误
如果我在 ActiveResource 对象中设置 Content-Type 标头,我仍然会收到 409:Conflict 错误 - 这让我相信 JSON 仍然没有正确形成。
编辑(再次)
我已经找到了 JSON 的问题所在 - Rails 将根保留在 JSON 中。 因此,而不是将资源发送回
{"name":"value", "name":"value"}
发送中
{"ResourceName": {"name":"value", "name":"value"}}
但是,我已将 include_root_in_json 设置为 false - 我在初始化程序文件中以及直接在模型本身中都尝试过,但没有任何更改。
【问题讨论】:
-
所以我通过在我的模型中覆盖
to_json方法来“修复”这个问题以简单地返回self.attributes.to_json- 但是,如果有人知道为什么include_root_in_json配置不起作用,我我仍然很好奇,因为我发现配置将是一个更优雅的解决方案。谢谢! -
您可能希望将解决方案添加为答案并接受它...
标签: json ruby-on-rails-3.2 activeresource actioncontroller