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更好的方法,这里我想评估序列化程序,非常棒。。。。。还没有实际尝试过,但仅仅阅读这里的内容听起来是一个正确的解决方案…如果你发现了新的提示或窍门,请更新它。谢谢