如何在JBuilder中渲染部分哈希值?

时间:2015-07-27 18:16:37

标签: ruby-on-rails json jbuilder

我有一个类似于树的对象图,类似于以下内容:

{
  :name => "Grandparent",
  :children => {
    :child_a => {
       :name => "Parent A",
       :children => {
         :grandchild_a_a => {
           :name => "Child A-A",
           :children => {}
         }
         :grandchild_a_b => {
           :name => "Child A-B"
           :children => {}
         }
       }
    }
    :child_b => {
       :name => "Parent B",
       :children => {}
    }
  }
}

我想生成镜像此结构的JSON。我不知道子嵌套有多深,每个级别的属性都是相同的。子哈希中的键很重要,必须保留。

我想使用JBuilder partial来表示一个级别,然后递归调用它。到目前为止,这是我的模板:

# _level_partial.json.jbuilder
# passing the above object graph as :level
json.name level[:name]
json.children do
  level[:children].each do |key, child|
    # How do I map the following to the given key?
    json.partial! "level_partial", :level => child
  end
end

我可以通过部分调用轻松地为每个子节点生成JSON,但是将其直接插入到JSON输出中。如何将partial的结果映射到特定的散列/对象键?

1 个答案:

答案 0 :(得分:5)

我找到了答案。虽然它似乎很大程度上没有文档,但JBuilder.set!可以接受块而不是显式值。该块可以调用partial,然后将其分配给散列。

json.name level[:name]
json.children do
  level[:children].each do |key, child|
    json.set! key do
      json.partial! "level_partial", :level => child
    end
  end
end