4

我试图渲染一个在其中引用自身的小胡子模板。但它给出了“堆栈级别太深”的错误。

这是我的红宝石代码。

以下代码片段位于 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内容在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}}

有人能指出我正确的方向吗?

4

1 回答 1

5

来自精美手册

Partials
[...]
它们也继承了调用上下文。而在 ERB 中,您可能会遇到以下情况:

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

小胡子只需要这个:

{{> next_more}}

为什么?因为next_more.mustache文件会从调用上下文继承sizestart方法。

因此,如果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 中充实您的数据,或者在解析它之后,我建议您在解析后充实它。

于 2012-09-21T17:46:54.443 回答