Как использовать разные шаблоны для сбора без корневого узла с раблом

Я работаю с Rabl некоторое время, и только сегодня я столкнулся с интересной проблемой, которую я не мог решить достаточно хорошо.

Итак, у меня есть коллекция, возвращенная из GET ".../list/512/resources", и вот мой пример шаблона рабла, который я использовал для возврата (без рута):

collection @resources
extends "api/v1/resources/_base"

=> { [ {...}, {...}, {...} ] }

Но теперь я понимаю, что хочу возвращать разные шаблоны для каждого ресурса в зависимости от их атрибутов... так это просто, верно?

node @resources => :resources do |resource|
  if resource.type == 'Document'
    partial('...', :object => resource)
  elsif @resource.type == 'Folder'
    partial('...', :object => resource)
  end
end

=> { ресурсы: [ {...}, {...}, {...} ] }

Но ох! Теперь я не хочу, чтобы этот узел "ресурсы" был там... как это сделать? Я пробовал что-то вроде:

array = []

@resources.each do |resource|
  if resource.type == 'Document'
    array << partial('...', :object => resource)
  elsif @resource.type == 'Folder'
    array << partial('...', :object => resource)
  end
end

collection array

но безуспешно, он возвращает пустые объекты, такие как => [ {}, {}, {}]. Любая идея, как я могу это сделать?


person mateusmaso    schedule 23.01.2013    source источник


Ответы (1)


Просто удалите весь «@resources => :resources», и это должно сработать (при условии, что это содержимое resources/index.json.rabl и ваш контроллер устанавливает @resources)

node do |resource|
  if resource.type == 'Document'
    partial('...', :object => resource)
  elsif @resource.type == 'Folder'
    partial('...', :object => resource)
  end
end

Вы можете проверить https://github.com/rails-api/active_model_serializers в качестве замены для рабл. Учитывая ваш вариант использования, это может быть проще в использовании.

person Arnaud    schedule 29.03.2013
comment
да, активные сериализаторы моделей рулят! Я использую его с тех пор, как создал этот вопрос и разочаровался в рабле. - person mateusmaso; 29.03.2013