Рекурсия в жидкой разметке / жидких шаблонах - PullRequest
5 голосов
/ 10 мая 2011

Я пытался выяснить, как я собираюсь сделать рекурсию с 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, чтобы он загружал партиалы из базы данных. Поскольку это займет гораздо больше времени для изучения, я сначала хотел спросить, решал ли кто-нибудь эту проблему раньше.

  • Если вы решали эту проблему раньше, как вы рендерили что-то рекурсивно и позволяли редактировать его пользователю?
  • Если бы вы раньше не занимались этим, какой путь вы бы порекомендовали мне выбрать? Как я описал выше?

Заранее спасибо!

1 Ответ

1 голос
/ 20 марта 2012

На самом деле вам не нужно «взламывать» Liquid для загрузки партиалов из БД, просто расширьте предоставленные классы файловой системы, прочитайте следующее для получения дополнительной информации:

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 / тайм-аут / RDoc / Timeout.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...