2012-05-23 64 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