2016-03-17 38 views
4

我使用的是主動型串行器v0.10.0.rc4::加載ActiveModel串行:: CollectionSerializer

我想產生JSON看起來像這樣:

{ 
    "posts": [ 
    { "post": {"id": 2, "name": "foo"} }, 
    { "post": {"id": 3, "name": "bar"} } 
    ], 
    "next_page": 3 
} 

我知道基本的:

render json: posts, each_serializer: PostSerializer 

會產生JSON是這樣的:

[ 
    {"id": 2, "name": "foo"} 
    {"id": 3, "name": "bar"} 
] 

我已經嘗試以下操作:

控制器:

render json: posts, serializer: PostsSerializer 

posts_serializer:

class PostsSerializer < ActiveModel::Serializer 
    attributes :posts, :next_page 

    def posts 
    ActiveModel::Serializer::CollectionSerializer.new(object, 
     each_serializer: PostSerializer, 
     root: "post" 
    ) 
    end 

    def next_page 
    3 
    end 
end 

但是,這會產生JSON是這樣的:

{ 
    "posts": [ 
    { 
     "object": {"id": 2, "name": "foo"}, 
     "instance_options": {"each_serializer: {}", "root": "post" } 
    }, 
    { 
     "object": {"id": 3, "name": "bar"}, 
     "instance_options": {"each_serializer: {}", "root": "post" } 
    }, 
    ], 
    "next_page": 3 
} 

任何人都知道我能做到所需的模式?

+0

我目前正在研究同樣的問題。請讓我知道,如果你知道這一點。 – sfkaos

回答

2

最後我沒有用CollectionSerializer。這是我用,而不是去:

控制器:

render json: posts, serializer: PostsSerializer 

posts_serializer:

class PostsSerializer < ActiveModel::Serializer 
    attributes :posts, :next_page 

    def posts 
    object.map do |p| 
     ActiveModel::SerializableResource.new(p, adapter: :json) 
    end 
    end 

    def next_page 
    # todo 
    end 
end 

指定json適配器確保了post元素有需要的根節點。

雖然我明白爲數組項目指定的根節點可能不是傳統的,但它是這個api所必需的。

0

您需要的JSON結果與JSON API格式中指定的類似。要通過active_model_serializers實現此目的,您需要使用JsonApi適配器。你可以在初始化文件中指定:

ActiveModelSerializers.config.adapter = :json_api 
相關問題