Создать вложенный JSON в Rails Controller - PullRequest
0 голосов
/ 27 декабря 2011

Я пытаюсь создать вложенный JSON с данными из различных таблиц БД и вернуть их, используя format.json {рендер 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 не очень хорошо сформирован. Пожалуйста, помогите мне, если можете. Спасибо

Ответы [ 2 ]

1 голос
/ 27 декабря 2011

Совершенно новый причудливый способ - использование шаблона представления и драгоценного камня ROAR.

В последнее время я использую его для 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.

Эти представители могут включать в себя определенные свойства / методы, связанные объекты и коллекции связанных объектов и позволяют указывать, как обрабатываются эти вложенные элементы (т.е. какой представитель и класс использовать при кодировании / декодировании).

Вот API, над которым я работаю с 3 уровнями вложения для класса Piece (Piece -> AudioVersion -> AudioFile):

https://github.com/PRX/prx_client

0 голосов
/ 12 июня 2014

Очень простым подходом к этому было бы просто: включить связанные записи с объектами, которые возвращаются в этих запросах контроллера. Я использую это в API, который живет в своем собственном маршруте пространства имен с отдельным контроллером, который возвращает только JSON и тем самым сохраняет вещи в чистоте и простоте. Вот простой пример действия show, которое возвращает контакты с их адресами в виде JSON:

/ приложение / контроллеры / 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 => related_model будет работать при любой настройке контроллера, которую вы используете. Это вернет контакт с вложенным массивом адресов, которые принадлежат этому контакту. Конечно, это работает и для действий с индексами.

Нет необходимости говорить, что сначала вам нужно установить отношение в ваших моделях, например, has_many: адреса в /models/contact.rb

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...