6

我一直在看这个一段时间,目前不知所措。我已将问题缩小到与 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

我得到了它的工作,但是

  1. 似乎必须明确设置 Content-Type 标头,否则会导致 415:Media Unrecognized 错误

  2. 如果我在 ActiveResource 对象中设置 Content-Type 标头,我仍然会收到 409:Conflict 错误 - 这让我相信 JSON 仍然没有正确形成。

编辑(再次)

我已经弄清楚 JSON 的问题出在哪里——Rails 将根保留在 JSON 中。因此,而不是将资源作为

{"name":"value", "name":"value"}

它正在发送

{"ResourceName": {"name":"value", "name":"value"}}

但是,我已设置include_root_in_json为 false - 我在初始化程序文件中以及直接在模型本身中都尝试了这个,并且没有更改。

4

2 回答 2

1

所以我通过覆盖to_json模型中的方法来“修复”这个(解决它)以简单地返回self.attributes.to_json

class Document < ActiveResource::Base
  self.site += 'user/:user_id'
  self.element_name = "docs"

  def to_json(options={})
    self.attributes.to_json(options)
  end
end
于 2012-10-10T19:25:33.440 回答
1

看起来 ActiveResource::Base.include_root_in_json 在 Rails 3-2-stable(包括 3.2.13)中被破坏了。此问题已在独立的 activeresource 存储库中修复:

def to_json(options={})
  super(include_root_in_json ? { :root => self.class.element_name }.merge(options) : options)
end

您可以通过做同样的事情在您的一个初始化程序中对其进行修补。

更新:此问题已在 rails 3-2-stable backport commit中修复

于 2013-05-11T03:31:46.367 回答