Article
的序列化程序有两个嵌套序列化程序:Author
和Chapter
。后两者也有自己独立的序列化器。我正在使用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
,那么错误就消失了。但是,缺点是它会为每个单独的作者和文章序列化程序中的章节重复元序列化程序的属性。
答案 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