2015-08-16 2 views
1

Я пытаюсь использовать пользовательские сериализаторы для отношений в сериализаторе и адаптере json_api. Однако отношения не сериализованы правильно (или, лучше, не отображаются вообще/сериализованы).Active Model Serializer не работает с адаптером json_api

PostController.rb

def index 
    render json: Post.all, each_serializer: Serializers::PostSerializer 
end 

Serializer

module Api 
    module V1 
    module Serializers 
     class PostSerializer < ActiveModel::Serializer 
     attributes :title, :id 

     belongs_to :author, serializer: UserSerializer 
     has_many :post_sections, serializer: PostSectionSerializer 
     end 
    end 
    end 
end 

JSON выход:

{ 
    "data": [ 
     { 
      "attributes": { 
       "title": "Test Title" 
      }, 
      "id": "1", 
      "relationships": { 
       "author": { 
        "data": { 
         "id": "1", 
         "type": "users" 
        } 
       }, 
       "post_sections": { 
        "data": [ 
         { 
          "id": "1", 
          "type": "post_sections" 
         } 
        ] 
       } 
      }, 
      "type": "posts" 
     } 
    ] 
} 

Как вы можете см., отношения не выполняются, что происходит , только если я задаю собственный сериализатор для отношений !!

Если я что-то вроде этого:

module Api 
    module V1 
    module Serializers 
     class PostSerializer < ActiveModel::Serializer 
     attributes :title, :id 

     belongs_to :author # no custom serializer! 
     has_many :post_sections # no custom serializer! 
     end 
    end 
    end 
end 

Взаимосвязи показаны правильно, но не с помощью пользовательского сериалайзер ... Что вопрос здесь?

EDIT

Согласно json API 1.0 Format, что я получаю обратно так называемый resource identifier object.

следующих основных данных представляет собой один объект идентификатор ресурса, который ссылается на тот же ресурс:

{ "данные": { "типа": "статьи", "идентификатор": "1" }}

Есть ли способ предотвратить получение объектов идентификатора ресурса и вместо этого получить фактические данные?

ответ

4

Отношения только возвращают id и type согласно json-api exmaples. Если вам нужно вернуть дополнительную информацию об этом отношении, вы должны добавить опцию include в действие рендеринга.

Ex.

PostController.rb

class PostsController < ApplicationController 
    def show 
    render json: @post, include: 'comments' 
    end 
end 

сериализаторы

class PostSerializer < ActiveModel::Serializer 
    attributes :id, :title, :content 
    has_many :comment, serializer: CommentSerializer 
end 

class CommentSerializer < ActiveModel::Serializer 
    attributes :id, :title, :content 
end 

JSON выход:

{ 
    "data": { 
     "id": "1", 
     "type": "post", 
     "attributes": { 
      "title": "bla", 
      "content": "bla" 
     }, 
     "relationships": { 
      "comment": { 
       "data": [ 
        { 
         "type": "comments", 
         "id": "1" 
        } 
       ] 
      } 
     } 
    }, 
    "included": { 
     { 
      "id": "1", 
      "type": "comments", 
      "attributes": { 
       "title": "test", 
       "content": "test" 
      } 
     } 
    ] 
} 
+0

@ CHRIS-Петерс или Бруно: Есть ли способ, т o включать ассоциации по умолчанию в сериализатор без необходимости делать это в контроллере в каждом месте, где мы называем рендеринг? Есть ли опция включения, которую мы могли бы добавить в has_one/has_many ассоциации в сериализаторе? – geoboy

+0

@geoboy Похоже, что сегодня у кого-то была такая же мысль: https://github.com/rails-api/active_model_serializers/issues/1333 Проблема указывает на то, что такого рода вещи еще не доступны. –