我试图呈现一个胡子模板,它正在引用它自己。但它给出了一个“堆栈级别太深”的错误。
这是我的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中充实您的数据,或者在解析它之后,我建议您在解析它之后充实它。