任意地在rabl中嵌套一些属性

时间:2012-03-28 10:36:45

标签: ruby-on-rails-3 json rabl

我正在为我的项目设计一个新的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我到目前为止还没有创建这种结构。

有什么建议吗?我正在寻找一种干式方法来为我的所有模型实现这一点。

2 个答案:

答案 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 }