Ruby on rails 自定义JSON的输出

Ruby on rails 自定义JSON的输出,ruby-on-rails,Ruby On Rails,在控制器中,我有这样一个响应单元: respond_with(@layer1 , @layer2) { "LayerOne": [ { "name": "haha", "number":"44" }, // more .... ], "LayerTwo": [ { "name": "James Bond", "score": 20 } // , .... ] }

在控制器中,我有这样一个响应单元:

respond_with(@layer1 , @layer2)
{
   "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
我需要的JSON输出如下:

respond_with(@layer1 , @layer2)
{
   "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
因此,为了获得第一部分,我编写了如下序列化程序:

respond_with(@layer1 , @layer2)
{
   "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

但请记住,一开始我有两件事要交给controller,所以现在我不知道如何做,因为JSON的第二部分说“Layer2”

Railcast有一个关于AR序列化程序的优秀视频+文本教程,我相信您会在那里找到答案


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

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
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"
            }
        ]
    ]
]

使用JBuilderDSL是解决您的问题的极好方法


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

您可以创建以下中间类:

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      

是的,我已经看过了,但无法解决我贴出的问题。有什么想法吗?谢谢,我已经在JBuilder中写过了,我想评估一下Serializer,看看在JBuilder中定制东西有多难/容易;这不是在使用序列化程序,这只是旧的样式,如_json。。。。我有比JBuidler更好的方法,这里我想评估序列化程序,非常棒。。。。。还没有实际尝试过,但仅仅阅读这里的内容听起来是一个正确的解决方案…如果你发现了新的提示或窍门,请更新它。谢谢