2012-05-23 14 views
5

我一直在寻找这一段时间,并在损失我目前。我将问题缩小到了与JSON相关的问题,并且JSON似乎没有以清晰的格式发送。的Rails 3.2 - 的ActiveResource - 使用POST/PUT使用JSON

我们以前使用Rails 3.0.7(这里我要说明不存在这个问题)。我们需要升级Rails以利用一些新功能 - 但现在出现了这个问题。我几乎肯定在这一点上它是一个简单的配置或什么,但我需要更多的眼睛。

我们正在使用的ActiveResource对象,在设置对象的值,并将其保存(从而使一个PUT),我们得到AB 403:禁止从远程Web服务返回。这在Web服务层上不是问题。

在创建一个新对象并进行POST时,我们得到一个409:因为它试图用默认值更新数据库而返回冲突 - 这意味着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" 

感谢您的任何建议!

UPDATE

我一直与卷曲测试并得到它的工作:

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. 它出现的内容型头必须明确设置,否则它会导致415:媒体无法识别的错误

  2. 如果我在的ActiveResource对象设置Content-Type头,我仍然得到409:冲突的错误 - 这使我相信仍不能正常形成的JSON。

EDIT(再次)

我已经想通了,在那里与JSON的问题是 - Rails的是保持根的JSON。 因此而不是发送资源重新作为

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

它发送

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

不过,我已设置include_root_in_json假 - 我想这无论是在初始化文件,并直接在模型本身,而且没有变化。

+2

所以我通过覆盖在我的模型的'to_json'方法简单地返回'self.attributes.to_json'“固定”这 - 但是,如果有人对'include_root_in_json'配置不起作用有什么想法,我仍然很好奇,因为我发现配置将是一个更优雅的解决方案。谢谢! – Krista

+0

您可能想要将解决方案添加为答案并接受它... – Smar

+0

谢谢!好主意 – Krista

回答

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 
1

貌似的ActiveResource :: Base.include_root_in_json用Rails破将8.88g稳定(包括3.2.13)。此问题已固定在独立的ActiveResource回购:

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

您可以用猴子做同样的事情修补它在你的初始化之一。

更新:此问题已被固定在轨3-2稳定backport commit

+0

3-2-stable合并了这个补丁请求。下一个版本3.2.14将包含此修复程序。 – Dingle