2016-03-17 2 views
4

Я использую Active Model сериализаторы v0.10.0.rc4ActiveModel :: Serializer :: 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