4

在控制器中,我有一个像这样的 respond_with:

respond_with(@layer1 , @layer2)

我需要的 JSON 输出是这样的:

{
   "LayerOne": [
      {
         "name": "haha",
         "number":"44"
      }, // more .... 
   ],
  "LayerTwo": [
     {
        "name": "James Bond",
        "score": 20
     } // , ....
  ]
}

因此,为了获得第一部分,我编写了这样的序列化程序:

class Layer1Serializer < ActiveModel::Serializer

  attributes :number, :name

  def name
    object.person.name
  end

end

我将控制器更改为这样,所以我可以传递一个 ROOT,以便它在 JSON 中显示为“LayerOne”

respond_with(@Layer1, root: 'LayerOne')

但请记住,一开始我有两件事要传递给控制器​​,所以现在我不知道如何为 JSON 的第二部分“Layer2”执行此操作

4

4 回答 4

6

您可以创建以下中间类:

class BothLayers
  include ActiveModel
  def initialize(layer1,layer2)
    @layer1 = layer1
    @layer2 = layer2
  end
  attr_accessor :layer1, :layer2
end

和以下序列化程序:

class BothLayersSerializer < ActiveModel::Serializer
  root false
  has_many :layer1, key: "LayerOne"
  has_many :layer2, key: "LayerTwo"
end      

然后在你的控制器中:

    both_layers = BothLayers.new(@layer1,@layer2)
    respond_with( both_layers, serializer: BothLayersSerializer )
于 2013-03-21T21:08:40.750 回答
1

创建一个新的哈希并将您的数组值传递给它。

respond_with({:LayerOne => @layer1.as_json(:only => [:name, :percentage]), :LayerTwo => @layer2.as_json(:only => [:name, :off_target_by])})

我得到了这个json:

{
    "LayerOne": [
        {
            "name": "layer1",
            "percentage": "10.11"
        },
        {
            "name": "layer 1 bis",
            "percentage": "1212.0"
        }
    ],
    "LayerTwo": [
        {
            "name": "layer 2",
            "off_target_by": 2
        },
        {
            "name": "layer 2 bis",
            "off_target_by": 9
        }
    ]
}

希望能帮助到你 :)

编辑 2:

您可以创建一个数组序列化程序来传递您的变量:

class LayerArraySerializer < ActiveModel::ArraySerializer
  self.root = false
end

在你看来:

respond_with({:LayerOne => @layer1 , :LayerTwo => @layer2}, :serializer => LayerArraySerializer)

json打印:

[
    [
        "LayerOne",
        [
            {
                "percentage": "10.11",
                "name": "layer1"
            },
            {
                "percentage": "1212.0",
                "name": "layer 1 bis"
            }
        ]
    ],
    [
        "LayerTwo",
        [
            {
                "off_target_by": 2,
                "name": "layer 2"
            },
            {
                "off_target_by": 9,
                "name": "layer 2 bis"
            }
        ]
    ]
]
于 2013-03-17T10:57:16.337 回答
1

使用 JBuilder DSL 是解决问题的好方法。

https://github.com/rails/jbuilder

您想要的 JSON 响应被实现为一个视图,让您可以完全控制它的呈现方式。

于 2013-03-17T12:45:31.620 回答
0

Railcasts 有一个关于 AR Serializer 的优秀视频+文本教程,我相信你会在那里找到答案

http://railscasts.com/episodes/409-active-model-serializers

于 2013-03-13T23:52:54.530 回答