В нашем приложении 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 ... снова ничего особенного.
Часто один партиал вызывает другой и может возвращать вложенный объект json на 2 или 3 уровня глубиной.
ПРОБЛЕМА
Как я уже упоминал выше, мы используем партиалы Jbuilder, чтобы быстро связать несколько партиалов вместе, чтобы сформировать глубоко вложенный объект json для представления. Нам также нужно создать те же самые вложенные объекты, что и хэш (а не json), И сделать их доступными для модели.
С помощью атрибутов .attributes легко заставить объект Jbuilder выводить хэш! метод, но у нас есть серьезные трудности с предоставлением 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
Приведенный выше пример явно неверен, но он показывает, что нужно делать. Я просто не уверен, как передать инициализацию контроллера из модели, а затем передать контекст контроллера.
Некоторые отведения, которым мы следуем:
Может ли кто-нибудь помочь нам указать правильное направление?