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

細かいマニュアルから:

パーシャル
[...]
呼び出しコンテキストも継承します。一方ERBでは、これがあるかもしれません:

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

口ひげはこれだけを必要とします:

{{> next_more}}

なんで?next_more.mustacheファイルは、呼び出し元のコンテキストからsizeメソッドとstartメソッドを継承するためです。

したがって、rels現在のコンテキストに no がない場合:

    "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 に答える