在我们的 rails 3.2 应用程序中,我们使用 Jbuilder 来呈现我们的 json 响应(这里没什么特别的)。json 视图可以像这样简单:
_model_name.json.jbuilder
json.extract!(page, :id, :name, :url_name)
我们经常需要返回一个深度嵌套的 json 对象,而 Jbuilder partials 非常适合这个:
_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 表示......再次没什么特别的。
通常,单个部分会调用另一个部分,并且可能会返回 2 或 3 层深的嵌套 json 对象。
问题
就像我上面提到的,我们使用 Jbuilder partials 将多个 partials 快速链接在一起,为视图形成一个深度嵌套的 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
上面的例子显然是不正确的,但它说明了需要做什么。我只是不确定如何从模型传递初始化控制器,然后传递控制器上下文。
我们正在关注的一些线索:
任何人都可以帮助我们指出正确的方向吗?