我正在为我的项目设计一个新的API,我希望将嵌套子项的对象作为json返回。为此,我决定使用RABL。
我希望客户端能够理解对象是否有效,如果没有,则为了正确保存它而缺少哪些字段。
我想到的设计应该在可选的哈希下包含一些可选的字段,其余的都是必需的。必填字段应出现在json的根目录下。 所以我试图描述的输出应该是这样的:
{
"name": "John",
"last_name": "Doe",
"optional": {
"address": "Beverly Hills 90210",
"phones":[{"number":"123456","name":"work"}, {"number":"654321","name":"mobile"}]
}
}
上面的输出示例描述了必需的字段名称和姓氏,以及不需要的地址和电话(与对象的belongs_to-has_many关系相关联)。 name,last_name和address是用户的DB字段。
使用RABL我到目前为止还没有创建这种结构。
有什么建议吗?我正在寻找一种干式方法来为我的所有模型实现这一点。
答案 0 :(得分:1)
RABL非常擅长动态创建JSON结构,因此我不明白为什么你无法实现目标。您是否尝试测试模式中是否将字段设置为null,从而将其显示为可选项?对我来说这似乎是一个很好的方法。对于嵌套子项,只需执行相同操作,但为子项扩展模板。
例如,在father/show.rabl
中显示一个自定义节点:optional
,其中包含所有可以为null的属性。
然后,使用相同的逻辑创建child/show.rabl
。最后,返回father/show.rabl
并添加子节点,扩展child/show.rabl
模板。通过这种方式,您可以获得无限级别的“期权”。
希望它对你有所帮助。
答案 1 :(得分:0)
在这种情况下,我会使用自由格式选项。
来自https://github.com/nesquena/rabl
还可能存在奇怪的情况,其中响应的根级别 不会直接映射到任何对象。
在这些情况下,可以将对象分配为“false” 节点可以自由构造。
object false
node(:some_count) { |m| @user.posts.count }
child(@user) { attribute :name }