Как создать кастом, содержащий JSON в RABL?

Я пишу API с двумя типами конечных точек: одиночной и совокупной. У меня есть представления RABL для отдельных конечных точек, как показано ниже:

# cat_view.json.rabl
object @cat
attributes :name

# dog_view.json.rabl
object @dog
attributes :name

Они работают, как и ожидалось, однако я борюсь с совокупным представлением RABL. Структура JSON, которую я хочу:

{
  'cats': {
    'details': [{'name': 'Mittens'},
                {'name': 'Mr. Wiskers'},
                {'name': 'Crookshanks'}],
    'count' : 3
  },
  'dogs': {
    'details': [{'name': 'Rover'},
                {'name': 'Fido'}],
    'count' : 2
  }
}

Мое текущее совокупное представление RABL:

# animals.json.rabl
child @cats do
  collection @cats, :object_root => false
  extends "cat_view"
end
node(:cat_count) { @cats.count }

child @dogs do
  collection @dogs, :object_root => false
  extends "dog_view"
end
node(:dog_count) { @dogs.count }

Что приводит к этому JSON:

    {'cats': [{'name': Mittens'},
              {'name': Mr. Wiskers'},
              {'name': Crookshanks'}],
    'cat_count': 3,
    'dogs': [{'name': 'Rover'},
             {'name': 'Fido'}],
    'dog_count': 2}

Мой вопрос:

Как должен выглядеть мой animals.json.rabl, чтобы получить описанную выше структуру JSON?


person Lucy Bain    schedule 17.11.2014    source источник


Ответы (1)


Чтобы добавить ключ details, назовите существующий блок child @cats details:

 child @cats => :details do
   collection @cats, :object_root => false
   extends "cat_view"
   node(:count) { @cats.count }
 end

Для вложенной части вашего вопроса вы можете сделать это, создав новый дочерний блок обертки:

# animals.json.rabl
child :cats do
 child @cats => :details do
   collection @cats, :object_root => false
   extends "cat_view"
   node(:count) { @cats.count }
 end
end

child :dogs do
 child @dogs => :details do
   collection @dogs, :object_root => false
   extends "dog_view"
   node(:count) { @dogs.count }
 end
end
person ang.gove    schedule 17.11.2014