【问题标题】:serializing array when nested with other attributes in rails 5与rails 5中的其他属性嵌套时序列化数组
【发布时间】:2017-07-07 22:29:39
【问题描述】:

我有一个 ruby​​ (2.4.0p0) rails (5.0.2) 控制器,我希望从中返回一个 json 结果,其中包含 Thing 对象列表以及一些高级信息(例如来自 Kaminari 分页的下一个和上一个)。

考虑与所有者关联的事物。事物具有 owner_id 属性。

对于@things = Thing.page(1).per(2) 我将能够使用

渲染 json:@things

得到;

[
    { "id": 1, "owner_id": 1, "name": "thing1" },
    { "id": 2, "owner_id": 1, "name": "thing2" }
]

很好。如果我然后创建一个名为 ThingSerializer.rb 的序列化程序并定义所有者,使其添加 "owner":"CatInHat" 而不是 "owner_id":1 这也有效;

[
    { "id": 1, "owner": "CatInHat", "name": "thing1" },
    { "id": 2, "owner": "CatInHat", "name": "thing2" }
]

这很好,但是,当我想添加更高级别的数据并将列表标记为“结果”时,例如我尝试时,我的问题就出现了;

渲染json:{下一个:“some_url_link”,上一个:“some_other_url_link”,结果:@bags}

我想要;

{ "next":some_url_link,
    "prev":some_other_url_link,
    "results":[ { "id": 1, "owner": "CatInHat", "name": "thing1" }, { "id": 2, "owner": "CatInHat", "name": "thing2" } ]
}

我得到的几乎是上述内容,但使用 "owner_id":1 而不是 "owner":"CatInHat" - 当我标记和嵌套我的事物列表时,我的序列化程序似乎没有被使用。使用我的序列化程序并获得此输出的适当方法是什么?

如果我创建 config/initializers/active_model_serializers.rb 并添加 ActiveModel::Serializer.config.adapter = :json_api 它为我提供了一个类似的 api,但我不知道是否可以对其进行自定义以符合我上面需要的规范。

感谢您的帮助

【问题讨论】:

    标签: ruby-on-rails json


    【解决方案1】:

    看起来render json: ... 中的序列化逻辑只有在属性是 ActiveRecord 对象或 ActiveRecord 对象数组时才会启动。由于您给它一个哈希,它不会检查各个属性并递归应用序列化程序。

    您可以尝试手动申请ThingSerializer

    render json: {
      next: ...,
      prev: ...,
      results: @things.map { |thing|
        ThingSerializer.new(thing).attributes
      },
    }
    

    【讨论】:

    • 我刚刚尝试过,现在我正在尝试追查错误;未定义的方法`read_attribute_for_serialization'
    • 我没有测试过代码,所以它可能不起作用。可以确定的一件事是您必须以某种方式手动调用序列化程序。
    • 是的,听起来很合理。我会继续朝着这个方向尝试一些事情。谢谢
    • 序列化程序可能无法处理整个元素数组。用一个一个一个序列化它的版本更新了这个例子。
    • 行得通!当数组是唯一被渲染的东西时,序列化确实处理了数组,例如我上面的第一个结果只是'render json:@things'但是当它嵌入更深时它似乎无法处理数组......谢谢为您的帮助!
    猜你喜欢
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多