我试图呈现一个胡子模板,它正在引用它自己。但它给出了一个“堆栈级别太深”的错误。
这是我的ruby代码。
下面的代码片段位于person.rb文件中

require 'mustache'
require 'active_support'

str = File.read("person.json")
j = ActiveSupport::JSON.decode(str)
Mustache.template_file = "person.mustache"
puts Mustache.render(j)

下面的json内容是in person.json
{
    "name":"Jason",
    "rels":[
        {"type":"friend",
        "ref":{
            "name":"John",
            "rels":[
                {"type":"friend",
                "ref":{"name":"Chrissy"}}
            ]
        }},
        {"type":"family",
        "ref":{"name":"Owen"}}
    ]
}

以下内容在person.mustache文件中
{{#rels}}
<ul>
  <li>Type: {{type}}</li>
  {{#ref}} {{> person}} {{/ref}}
</ul>
{{/rels}}

有人能告诉我正确的方向吗?

最佳答案

fine manual开始:
分音
[…]
它们还继承调用上下文。鉴于在ERB中,您可能拥有:

<%= partial :next_more, :start => start, :size => size %>

胡子只需要这个:
{{> next_more}}

为什么?因为下一个mustache文件将从调用上下文继承size和start方法。
因此,如果当前上下文中没有rels
    "ref": { "name": "Chrissy" }

然后您将从父对象继承rels。这将给您一个来自父对象的部分引用rels,该父对象再次激活该部分,该部分引用来自父对象的rels,该父对象将一直运行,直到您用完堆栈。
如果要构建这样的递归模板:
{{#rels}}
<ul>
  <li>Type: {{type}}</li>
  {{#ref}} {{> person}} {{/ref}}
</ul>
{{/rels}}

然后需要在每个级别上都有完整的对象:
{
    "name":"Jason",
    "rels":[
        {"type":"friend",
        "ref":{
            "name":"John",
            "rels":[
                {"type":"friend",
                "ref":{"name":"Chrissy","rels":[]}} // <--- rels here
            ]
        }},
        {"type":"family",
        "ref":{"name":"Owen","rels":[]}} // <-------------- and here
    ]
}

您可以在json中充实您的数据,或者在解析它之后,我建议您在解析它之后充实它。

10-07 17:10