从Rails控制器自定义JSON格式

时间:2013-05-03 21:14:22

标签: javascript ruby-on-rails json api

我有两种导轨型号:

里程碑有很多任务 任务属于里程碑

在我的控制器中,我打电话给以下人员:

@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。即使我不得不丢失“milestone_”部分并且只是吐出ID,这将非常有帮助。

谢谢!

1 个答案:

答案 0 :(得分:3)

看一下json_builder gem。

你所问的肯定是可行的,但是当你开始对控制器的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。这将提高性能,并在出现问题时更容易调试。很明显哪些领域会出现在哪里。