В нашем приложении rails 3.2 мы используем Jbuilder для рендеринга наших ответов json (здесь ничего особенного).Представление json может быть таким простым:
_model_name.json.jbuilder
json.extract!(page, :id, :name, :url_name)
Нам часто нужно возвращать глубоко вложенный объект json, и для этого прекрасно работают партиалы Jbuilder:
_page.json.jbuilder
json.extract!(page, :id, :name, :url_name)
json.page_images (page_images) do |json, page_image|
json.partial! page_image
end
В последнем примере будут извлечены страница и вложенные page_images, представление json ... опять ничего особенного.
Часто одинpart будет вызывать другой и может возвращать вложенный объект json глубиной 2 или 3 уровня.
ПРОБЛЕМА
Как я уже говорил выше, мы используем партиалы Jbuilder для быстрой связи несколькихЧастицы вместе, чтобы сформировать глубоко вложенный объект JSON для представления.Нам также необходимо собрать эти точно такие же вложенные объекты как хэш (а не json) и сделать их доступными для модели.
Получить объект Jbuilder для вывода хеша с помощью .attributes просто!метода, но у нас есть некоторые серьезные трудности, связанные с предоставлением Jbuilder доступа к частичным представлениям из модели.
Если посмотреть на источник Jbuilder, то класс JbuilderTemplate должен иметь доступ к контексту контроллера, чтобы все работало.
Мы можем попробовать что-то вроде этого:
class SomeClass
def initialize pages
@pages = pages
@context = ActionController::Base.new
end
def to_hash
builder = JbuilderTemplate.new(@context)
builder.pages(@pages) do |json, page|
json.partial! page
end
builder.attributes!
end
end
Приведенный выше пример, очевидно, неверен, но он иллюстрирует, что нужно сделать.Я просто не уверен, как пройти инициализацию контроллера из модели, а затем передать контекст контроллера.
Некоторые выводы, которые мы следуем:
Может кто-нибудь помочь направить нас в правильном направлении?