如何在控制器外递归使用ActiveModel::Serializers?
How to use ActiveModel::Serializers recursively outside of controller?
目标:在 Rails 控制器之外的嵌套级别之外递归地序列化记录,其中每个嵌套记录都使用自己的序列化程序。
我可以从控制器中递归地成功使用 ActiveModel::Serializers:
render json: @record, include: ['**']
并且我可以在控制器外部成功使用 ActiveModel::Serializers 到第一级嵌套:
RecordSerializer.new(@record, include: ['**']).as_json
但是,第二段代码不会递归到第一层之外。
例如,假设第一段代码returns如下:
{
"name": "Parent",
"child": {
"name": "Child",
"grandchild": {
"name": "Grandchild"
}
}
}
第二段代码然后returns如下:
{
"name": "Parent",
"child": {
"name": "Child"
}
}
好的,我明白了。
你必须这样做:
ActiveModelSerializers::SerializableResource
.new(@record, include: ['**']).as_json
您不能在序列化程序上调用 new 并向其传递选项;你必须使用 ActiveModelSerializers::SerializableResource
.
目标:在 Rails 控制器之外的嵌套级别之外递归地序列化记录,其中每个嵌套记录都使用自己的序列化程序。
我可以从控制器中递归地成功使用 ActiveModel::Serializers:
render json: @record, include: ['**']
并且我可以在控制器外部成功使用 ActiveModel::Serializers 到第一级嵌套:
RecordSerializer.new(@record, include: ['**']).as_json
但是,第二段代码不会递归到第一层之外。
例如,假设第一段代码returns如下:
{
"name": "Parent",
"child": {
"name": "Child",
"grandchild": {
"name": "Grandchild"
}
}
}
第二段代码然后returns如下:
{
"name": "Parent",
"child": {
"name": "Child"
}
}
好的,我明白了。
你必须这样做:
ActiveModelSerializers::SerializableResource
.new(@record, include: ['**']).as_json
您不能在序列化程序上调用 new 并向其传递选项;你必须使用 ActiveModelSerializers::SerializableResource
.