序列化程序的超类不匹配

时间:2016-01-24 01:29:45

标签: ruby-on-rails ruby-on-rails-4 serialization associations active-model-serializers

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

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

  

类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,那么错误就消失了。但是,缺点是它会为每个单独的作者和文章序列化程序中的章节重复元序列化程序的属性。

1 个答案:

答案 0 :(得分:1)

我的猜测是嵌套序列化程序的问题出现在名称空间中。实际上,当您在其他类中创建类时,您将在其他名称空间内创建一个类。内部类除了名称外,不会从外部继承任何东西。因此,内部 AuthorSerializer 可以被称为Api::V1::ArticleSerializer::Api::V1::AuthorSerializer 所以尝试重命名你的类

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