1

私は2つのレールモデルを持っています:

マイルストーンには多くのタスクがあります タスクはマイルストーンに属します

私のコントローラーでは、次のように呼び出します。

@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 を吐き出さなければならない場合でも、それは非常に役立ちます。

ありがとう!

4

1 に答える 1

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を消費しているリソースに必要なモデルの正確なフィールドのみを含める傾向があります。これにより、パフォーマンスが向上し、問題が発生したときにデバッグが容易になります。また、どのフィールドがどこに表示されるかは非常に明白です。

于 2013-05-03T21:18:09.297 に答える