Rails 3.2 - ActiveResource - 使用POST/PUT和JSON

Kri*_*sta 6 json activeresource actioncontroller ruby-on-rails-3.2

我一直在看这个,现在我不知所措.我已经将问题缩小到与JSON相关,并且JSON似乎没有以清晰的格式发送.

我们之前使用的是Rails 3.0.7(我将要描述的问题不存在).我们需要升级Rails以利用一些新功能 - 但现在存在这个问题.我几乎可以肯定这是一个简单的配置或者什么,但是我需要更多关注它.

我们正在使用ActiveResource对象,在设置对象的值并保存它(从而产生PUT)时,我们得到ab 403:从远程Web服务返回Forbidden.这不是Web服务层的问题.

在创建一个新对象并进行POST时,我们得到一个409:在尝试使用默认值更新数据库时返回冲突 - 这意味着json数据未到达服务 - 或者不清晰.

我的问题是这在Rails 3.0.7中有效,并且不再适用于3.2.3(或我也尝试过的3.1.3).我对JSON数据以外的建议持开放态度,但我很确定这就是问题所在.

我的ActiveResource模型有

self.format = :json
Run Code Online (Sandbox Code Playgroud)

我在其中一个初始化文件中有以下内容:

ActiveResource::Base.include_root_in_json = false
ActiveSupport::JSON.backend = "json_gem" 
Run Code Online (Sandbox Code Playgroud)

谢谢你的任何建议!

UPDATE

我一直在测试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
Run Code Online (Sandbox Code Playgroud)

我得到了它的工作,但是

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

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

编辑(再次)

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

{"name":"value", "name":"value"}
Run Code Online (Sandbox Code Playgroud)

它正在发送

{"ResourceName": {"name":"value", "name":"value"}}
Run Code Online (Sandbox Code Playgroud)

但是,我设置include_root_in_json为false - 我在初始化文件中尝试了这一点,并且直接在模型本身中尝试了这一点,并且没有任何更改.

Kri*_*sta 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
Run Code Online (Sandbox Code Playgroud)