红宝石中的递归胡须部分

Sre*_*tha 4 ruby recursion mustache

我试图渲染一个在其中引用自己的胡子模板.但它给出了"堆栈级太深"的错误.

这是我在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)
Run Code Online (Sandbox Code Playgroud)

以下json内容在person.json中

{
    "name":"Jason",
    "rels":[
        {"type":"friend",
        "ref":{
            "name":"John",
            "rels":[
                {"type":"friend",
                "ref":{"name":"Chrissy"}}
            ]
        }},
        {"type":"family",
        "ref":{"name":"Owen"}}
    ]
}
Run Code Online (Sandbox Code Playgroud)

以下内容位于person.mustache文件中

{{#rels}}
<ul>
  <li>Type: {{type}}</li>
  {{#ref}} {{> person}} {{/ref}}
</ul>
{{/rels}}
Run Code Online (Sandbox Code Playgroud)

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

mu *_*ort 5

精细手册:

Partials
[...]
他们还继承了调用上下文.在再培训局,您可能有:

<%= partial :next_more, :start => start, :size => size %>
Run Code Online (Sandbox Code Playgroud)

小胡子只需要这个:

{{> next_more}}
Run Code Online (Sandbox Code Playgroud)

为什么?因为next_more.mustache文件将继承调用上下文的大小启动方法.

所以,如果rels在当前上下文中没有:

    "ref": { "name": "Chrissy" }
Run Code Online (Sandbox Code Playgroud)

然后你将继承rels父母.这会让你rels从父进程中进行部分引用,从而再次激活部分引用来自父进程的引用rels,直到你用完堆栈为止.

如果你要构建一个这样的递归模板:

{{#rels}}
<ul>
  <li>Type: {{type}}</li>
  {{#ref}} {{> person}} {{/ref}}
</ul>
{{/rels}}
Run Code Online (Sandbox Code Playgroud)

那么你需要在每个级别都有完整的对象:

{
    "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
    ]
}
Run Code Online (Sandbox Code Playgroud)

您可以在JSON中充实您的数据,或者在解析它之后,我建议您在解析它之后将其充实.