Рекурсия в жидкой разметке / жидких шаблонах
Я пытался выяснить, как я буду делать рекурсию с 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 ответ
На самом деле вам не нужно "взламывать" 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/timeout/rdoc/Timeout.html