2

在我们的 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

上面的例子显然是不正确的,但它说明了需要做什么。我只是不确定如何从模型传递初始化控制器,然后传递控制器上下文。

我们正在关注的一些线索:

任何人都可以帮助我们指出正确的方向吗?

4

4 回答 4

2

我很确定你在这里是在正确的轨道上。json.array!如果您直接在初始化程序中传递块,您应该能够正常调用和构建部分。

def to_hash
  builder = JbuilderTemplate.new(@context) do |json|
    json.array! @pages, partial: 'path/to/partial'
  end
  builder.attributes!
end
于 2016-06-22T20:05:24.767 回答
1

找不到解决方案。我们回到使用 as_json 来配置我们的模型 json 输出。

于 2012-02-11T12:03:55.363 回答
0

如果你真的需要这个功能,我可以给你看一些垫片:

c = ActionController::Base.new
c.instance_variable_set '@item', Item.find(5)
JSON.parse c.render_to_string('items/show')
于 2014-01-15T16:48:38.547 回答
0

我使用 ActiveModel::Serializer 来做同样的事情。您可以在模型或任何地方渲染 json - 我们这样做是为了预填充缓存。

这样做的语法最初并不明显,所以我在这里发布:

ItemSerializer.new(item).to_json
于 2013-06-21T17:27:07.707 回答