序列化器的超类不匹配

Superclass mismatch for serializer

Article 的序列化程序有两个嵌套的序列化程序:AuthorChapter。后两者也有自己的序列化器。我正在使用 active_model_serializer gem.

# The nested serializer
class Api::V1::ArticleSerializer < Api::V1::SerializerWithSessionMetadata
  attributes :id, ...
  has_many :authors, root: :authors_attributes
  has_many :chapters, through: :authors, root: :chapters_attributes

  class Api::V1::AuthorSerializer < ActiveModel::Serializer
    ...
  end
  class Api::V1::ChapterSerializer < ActiveModel::Serializer
    ...
  end
end

# The two individual serializers
class Api::V1::AuthorSerializer < Api::V1::SerializerWithSessionMetadata
  ...
end

class Api::V1::ChapterSerializer < Api::V1::SerializerWithSessionMetadata
  ...
end

问题: 我目前有时会遇到错误,而有时却不会(在发出相同的服务器请求时)。如果发生错误,我重新启动服务器,发出相同的请求,并且错误不存在。

superclass mismatch for class ArticleSerializer

错误指的是嵌套序列化程序中的 class Api::V1::AuthorSerializer < ActiveModel::Serializer。在创建新的 author 记录时似乎尤其如此。这使用:

author = @article.authors.build(create_params)
if author.save
  render json: @article, status: :created
end

因此此方法的 render 行在创建作者后调用嵌套序列化程序。这种行为的原因可能是什么?

class Api::V1::AuthorSerializer < ActiveModel::Serializer 是正确的还是应该继承自其他内容?也许它认为 Author 的嵌套序列化程序在层次结构中更高,因为它继承自比其单个序列化程序更高的序列化程序。因此,当它应该使用其单独版本时使用嵌套版本。

如果我让嵌套版本继承自 Api::V1::SerializerWithSessionMetadata,那么错误就消失了。但是,缺点是它会为文章序列化程序中的每个作者和章节重复元序列化程序中的属性。

我的猜测是问题出在嵌套序列化程序的 命名空间 中。当您在其他人中创建一个 class 时,实际上,您在其他人的命名空间中创建了一个 class。而 inner class 除了它的名字之外没有从 outer 继承任何东西。所以你的 inner AuthorSerializer 可以被称为 Api::V1::ArticleSerializer::Api::V1::AuthorSerializer 所以尝试重命名你的 classes

class Api::V1::ArticleSerializer < Api::V1::SerializerWithSessionMetadata
  ...

  class AuthorSerializer < ActiveModel::Serializer
    ...
  end

  class ChapterSerializer < ActiveModel::Serializer
    ...
  end
end

# The two individual serializers
class Api::V1::AuthorSerializer < Api::V1::SerializerWithSessionMetadata
  ...
end

class Api::V1::ChapterSerializer < Api::V1::SerializerWithSessionMetadata
  ...
end