【问题标题】:Create Nested JSON in Rails Controller在 Rails 控制器中创建嵌套 JSON
【发布时间】:2012-01-28 08:16:58
【问题描述】:

我正在尝试创建一个嵌套的 JSON,其中包含来自各种 db 表的数据并使用它返回它 format.json {render json: @Model}

例如这样的json结构:

{"Model1": [
        {"id": 3, "name": "newURI", {"Model2": ["id": 4, "name":"vill"]}},
        {"id": 1, "name": "bill", {"Model2": ["id": 1, "name":"lily"]}},
        {"id": 2, "name": "ton", {"Model2": ["id": 2, "name":"bow"]}},
    ]}

我四处寻找,但不太成功。我看到了 Rabl,但是生成的嵌套 JSON 格式不正确。如果可以,请你帮助我。谢谢

【问题讨论】:

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


    【解决方案1】:

    一种非常新奇的方式是使用表示器模式和 ROAR gem。

    我最近一直将它用于 API,并且喜欢它。这两个帖子比我描述的更好:

    http://nicksda.apotomo.de/2011/12/ruby-on-rest-introducing-the-representer-pattern/

    http://nicksda.apotomo.de/2011/12/ruby-on-rest-2-representers-and-the-dci-pattern/

    您可以定义允许编码或解码 json 的表示器模块。 将它们包含在您的模型中,或在运行时扩展它们,您可以对 json 编码逻辑进行大量控制。

    这些表示器可以包括特定的属性/方法、关联对象和关联对象的集合,并允许您指定如何处理这些嵌套元素(即编码/解码时使用什么表示器和类)。

    这是我正在为 Piece 类(Piece -> AudioVersion -> AudioFile)使用 3 层嵌套的 API:

    https://github.com/PRX/prx_client

    【讨论】:

    • 谢谢。这有点让我想做的事情复杂化,但无论如何谢谢。
    【解决方案2】:

    对此的一个非常简单的方法是:将相关记录与这些控制器请求中返回的对象一起包含在内。我在一个 API 中使用它,该 API 位于它自己的命名空间路由中,并带有一个单独的控制器,该控制器只返回 JSON,从而使事情保持干净和简单。下面是一个显示操作的简单示例,该操作以 JSON 格式返回联系人的地址:

    /app/controllers/api/contacts_controller.rb

    module Api
        class ContactsController < ApplicationController
            respond_to :json
    
            ...
    
            def show
                respond_with Contact.find(params[:id]), :include => :addresses
            end
    
            ...
    
         end
    end
    

    我认为:include =&gt; related_model 也可以在您使用的任何控制器设置中工作。这将返回一个联系人,其中包含属于该联系人的嵌套地址数组。当然,它也适用于索引操作。

    不用说,您需要先在模型中设置关系,例如has_many :/models/contact.rb 中的地址

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 1970-01-01
      • 2023-03-26
      相关资源
      最近更新 更多