7

私はLiquidでどのように再帰を行うのかを理解しようとしてきました。メニューのレンダリングをユーザーが完全に制御できるようにしたいアプリがあります。ただし、メニューはツリーによって定義されるため、Liquidでは再帰関数が必要です。

どうすればいいですか?いくつかの読書をした後、私は私がこのようにそれに取り組むだろうと思っていました:

含む

私はincludeこのように使うことを考えていました:

<ul id='site_nav' class='nav'>
  {{ include 'menu_item' with menu_items }}
</ul>

そしてmenu_itemの部分はこれです:

<li id='{{menu_item.dom_id}}' class='{{menu_item.css_menu_class}}'>
  {{ menu_item.name }}
  <ul>
    {{ include 'menu_item' with menu_item.children }}
  </ul>
</li>

ただし、ユーザーが編集できるため、Liquidをハックして、データベースからパーシャルをロードする必要があります。それは勉強にもっと時間がかかるので、私は最初に誰かが以前にこの問題に取り組んだことがあるかどうか尋ねたいと思いました。

  • 以前にこの問題に取り組んだことがある場合、どのようにして再帰的に何かをレンダリングし、ユーザーが編集できるようにしましたか?
  • これまでにこれに取り組んだことがない場合、私がどのように取り組むことをお勧めしますか?私が上で詳述した方法は?

前もって感謝します!

4

1 に答える 1

1

実際には、Liquid を「ハック」して DB からパーシャルをロードする必要はありません。提供されたファイル システム クラスを拡張するだけです。詳細については、以下を参照してください。

https://github.com/Shopify/liquid/blob/master/lib/liquid/file_system.rb

私は自分自身の前にこの方法で Liquid を実装しましたが、Ruby を使い慣れていることがわかっている場合は、特に難しいことではないと保証できます。

再帰に関しては、Liquid はおそらくそれを制限しません (テンプレートの例は機能するはずです) が、レンダリング プロセスを Timeout::timeout (以下のリンクを参照) でラップして、それが永遠に続かないようにします。

http://www.ruby-doc.org/stdlib-1.9.3/libdoc/timeout/rdoc/Timeout.html

于 2012-03-20T10:21:58.837 に答える