【问题标题】:Rails 3.2 - ActiveResource - Using POST/PUT with JSONRails 3.2 - ActiveResource - 使用带有 JSON 的 POST/PUT
【发布时间】: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

我得到了它的工作,但是

  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 - 我在初始化程序文件中以及直接在模型本身中都尝试过,但没有任何更改。

【问题讨论】:

  • 所以我通过在我的模型中覆盖 to_json 方法来“修复”这个问题以简单地返回 self.attributes.to_json - 但是,如果有人知道为什么 include_root_in_json 配置不起作用,我我仍然很好奇,因为我发现配置将是一个更优雅的解决方案。谢谢!
  • 您可能希望将解决方案添加为答案并接受它...

标签: json ruby-on-rails-3.2 activeresource actioncontroller


【解决方案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

【讨论】:

    【解决方案2】:

    看起来 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

    中修复

    【讨论】:

    • 3-2-stable 已合并此补丁拉取请求。下一个版本 3.2.14 将包含此修复。
    猜你喜欢
    • 2012-09-11
    • 2013-01-15
    • 2010-10-21
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    相关资源
    最近更新 更多