2013-05-03 59 views
1

我有兩個軌道型號:自定義從Rails控制器格式化爲JSON

的里程碑有許多任務 任務屬於一個里程碑

在我的控制器中我調用如下

@milestones = Milestone.all 
render :json => @milestones.to_json(:include => :tasks) 

這給了我:

[ { 
    "id": 5, 
    "name": "This is milestone #1", 
    "tasks": [{ 
      "complete": false, 
      "id": 60, 
      "name": "aaaaa", 
      "milestone_id": 5, 
     }, { 
      "complete": false, 
      "id": 62, 
      "name": "ccccc", 
      "milestone_id": 5, 
     } 
    ] 
}, { 
    "id": 6, 
    "name": "This is milestone #2", 
    "tasks": [{ 
      "complete": false, 
      "id": 65, 
      "name": "ffffff", 
      "milestone_id": 5, 
     }, { 
      "complete": false, 
      "id": 66, 
      "name": "gggggg", 
      "milestone_id": 5, 
     } 
    ] 
} 

]

但我需要能夠輕鬆瀏覽JSON,因此我希望能夠像這樣格式化(注意每個「子數組」都標有「milestone_ID」或「task_ID」):

[ 
"milestone_5": { 
    "id": 5, 
    "name": "This is milestone #1", 
    "tasks": [ 
     "task_60":{ 
      "complete": false, 
      "id": 60, 
      "name": "aaaaa", 
      "milestone_id": 5, 
     }, 
     "task_62":{ 
      "complete": false, 
      "id": 62, 
      "name": "ccccc", 
      "milestone_id": 5, 
     } 
    ] 
}, 

"milestone_6":{ 
    "id": 6, 
    "name": "This is milestone #2", 
    "tasks": [ 
     "task_65":{ 
      "complete": false, 
      "id": 65, 
      "name": "ffffff", 
      "milestone_id": 5, 
     }, 
     "task_66":{ 
      "complete": false, 
      "id": 66, 
      "name": "gggggg", 
      "milestone_id": 5, 
     } 
    ] 
} 

]

沒有任何人有任何想法如何讓Rails的自定義格式JSON。即使我不得不失去「里程碑」部分,只是吐出ID,那也是非常有用的。

謝謝!

+0

是否有一個特定的原因需要它是「milestone_6」而不是一系列里程碑?你的輸出似乎擊敗了json的許多目的。爲什麼每個鍵都需要包含'id',如果你已經有了它的值呢? – nzifnab 2013-05-03 21:20:04

+0

在密鑰中包含id將使我可以更輕鬆地瀏覽嵌套的json。我必須做很多替換/更新,因爲我使用的是前端MVC。 – nathan 2013-05-04 16:48:27

回答

3

看看json_builder寶石。

你提出的問題當然是可行的,但是當你開始做任何遠程有用的控制器的json輸出時,缺省的to_json方法變得笨拙。最好明確地輸出你想要的json的樣子。

在json_builder文件

具體...

milestone.json.json_builder

@milestones.each do |milestone| 
    key "milestone_#{milestone.id}" do 
    id milestone.id 
    name milestone.name 
    end 
end 

等等等等,我相信會做的伎倆。

編輯:我傾向於只包含模型中的確切字段,我需要爲任何資源消耗我的json。這可以提高性能,並且在出現問題時可以更容易地進行調試。哪些領域將在哪裏出現也是非常明顯的。

+0

正是我在找的!是的,我計劃只包括我需要的少數領域,因爲JSON可能會變得很長,非常快。 – nathan 2013-05-04 16:47:28