【问题标题】:serializer is not beeing used if included in a hash如果包含在哈希中,则不使用序列化程序
【发布时间】:2017-04-15 15:32:48
【问题描述】:
ActiveModelSerializers.config.default_includes = '**'

我们通过序列化程序渲染 cmets,包括作者和一些信息。

这是使用序列化程序,一切正常

render json: comments

然而,我们还需要发送额外的元数据,所以我们将它包装成一个散列。不幸的是,这没有使用序列化程序,我们无法弄清楚原因

render json: {comments: comments, upvoted: upvoted, downvoted: downvoted}

【问题讨论】:

  • 您是否尝试过使用as_jsonrender json: { comments: comments.as_json, upvoted: upvoted, downvoted: downvoted } 之类的东西?
  • 那么您确实定义了 cmets 序列化程序吗?像一个实际的 CommentsSerializer 类?
  • @Gerry,与 as_json 或 to_json 无关,因为这是默认完成的。只是缺少对序列化程序的查找
  • @arjabbar 确实如此。正如我所说,第一行是有效的,只是它不是一个哈希。这篇文章发现了问题github.com/rails-api/active_model_serializers/issues/…

标签: ruby-on-rails active-model-serializers


【解决方案1】:

您可能想要的是在元数据中包含 upvoted 和 downvoted 属性。要将 upvoted 和 downvoted 属性包含为元数据,您必须使用 json 或 json_api 适配器。在你的控制器中有这个:

render json: comments, meta: { upvoted: upvoted, downvoted: downvoted }, adapter: :json

将呈现:

{
  "comments": [
    // your comments...
  ],
  "meta": {
    "upvoted": 4243,
    "downvoted": 123
  }
}

或者您可以为此响应创建一个模型,该模型具有 cmets 以及 upvoted 和 downvoted 属性。

【讨论】:

【解决方案2】:

根据 git

https://github.com/rails-api/active_model_serializers/issues/2102#issuecomment-293292697

如果我们渲染一个散列而不是一个集合,就不可能自动使用序列化器。解决方法是

json = Hash.new
json[:comments] = ActiveModel::SerializableResource.new(comments)
json[:upvoted] = upvoted
json[:downvoted] = downvoted
render status: :ok, json: json

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2013-06-25
    • 2023-03-17
    • 2011-11-16
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    相关资源
    最近更新 更多