Сериализация отношений с настраиваемыми полями в ActiveModelSerializer - PullRequest
0 голосов
/ 26 апреля 2018

У меня возникли проблемы с использованием ActiveModelSerializer для правильной сериализации моей модели.Настройка выглядит следующим образом:

# controllers/posts_controller.rb
class PostsController < ApplicationController

  def index
   render json: @posts, each_serializer: PostSerializer, include: %w(comments), fields: post_fields
  end

  private

  def post_fields
    { posts: [:name, :content, :author] }
  end
end

# serializers/post_serializer.rb
class PostSerializer < ActiveModelSerializer
  attributes :name, :content, :author
  has_many :comments, serializer: CommentSerializer
end

Когда я делаю запрос к конечной точке posts#index, я ожидаю ответ JSON, который отформатирован в спецификации JSON-API, как показано ниже:

{
  "data": {
    "type": "post",
    "id": 1,
    "attributes": {
      "name": "My first post",
      "author": "Mr. Glass",
      "content": "This is my first post ..."
    },
    "relationships": {
      "comments": {
        "data": {
          "id": 1,
          "type": "comments"
        }
      }
    }
  },
  "included": {
    "type": "comments",
    "id": 1,
    "attributes": {
      "content": "First!"
    }
  }
}

Однако фактический ответ таков:

{
  "data": {
    "type": "post",
    "id": 1,
    "attributes": {
      "name": "My first post",
      "author": "Mr. Glass",
      "content": "This is my first post ..."
    }
  },
  "included": {
    "type": "comments",
    "id": 1,
    "attributes": {
      "content": "First!"
    }
  }
}

И весь блок отношений просто отсутствует.Есть ли способ заставить блок отношений в реальном ответе появиться снова?

1 Ответ

0 голосов
/ 26 апреля 2018

Я понял это!

Для любых будущих читателей - если вы хотите, чтобы в ActiveModelSerializer присутствовал блок relationships, а также опция fields, вам нужно будет сделать следующее:

# in your controller
render json: @posts, include: %(comments), fields: post_fields

def post_fields
  # note the inclusion of "comments" in the array of fields to be 
  # serialized. That is the change you will need to make.
  { posts: [:name, :author, :content, :comments] }
end

Надеюсь, это поможет!

...