-
Notifications
You must be signed in to change notification settings - Fork 0
views
Шаблоны располагаются в файлах
proj/app/views/имя_контроллера/имя_шаблона.html.eml
.
На данный момент только ecaml для шаблонов, а шаблоны генерируют только html.
Конечно, будет расширяться по нужде.
Действие контроллера по своему завершению выдаёт http-ответ. Чтобы выдать ответ, сгенерированный каким-либо шаблоном, в качестве возвращаемого действием значения можно написать
Имя_контроллера.Имя_шаблона.render <окружение>
Окружение -- это такой окамловский объект, который в своих методах хранит значения, требуемые как самому шаблону, так и вызываемым из него шаблонам.
Объекты были выбраны за замечательные возможности структурной подтипизации, в других языках известной как duck typing. Нет нужды объявлять типы всех методов, требуемых шаблону, достаточно просто предоставить их. Или словить ошибку компиляции, если чего-то не хватает.
На низком уровне, без сахара, это так:
<% <имя_контроллера>_<имя_шаблона> env buf %>
Да, без модулей, некрасиво. Но иначе не получается, учитывая возможные взаимно-рекурсивные зависимости между шаблонами.
Аргумент env
-- окружение для шаблона, который будем рендерить.
Аргумент buf
-- буфер (с типом Buffer.t
), в который рендерится текущий
шаблон.
Прозреваю, что это весьма неудобный способ рендерить шаблон, поэтому кое-что
будет исправлено кодогенерацией. Например, для выборочного изменения env
без ручного копирования всех методов, кроме тех, которые требуют изменения.
Шаблоны обычно рендерятся в пределах какого-то шаблона, специфичного для
веб-приложения. Это называется layout. Они хранятся в
proj/app/views/layouts/имя_layout'а.html.eml
. Они содержат вызов
render_template ()
для непосредственного рендеринга шаблона, вложенного
в этот layout.
А для выбора нужного layout'а -- из контроллера вызываем
Имя_контроллера.Имя_шаблона.render ~layout:Layout.имя_layout'а <окружение>
либо
Имя_контроллера.Имя_шаблона.render ?layout:None <окружение>
для рендеринга просто шаблона, без layout'а.
Мы серьёзные пасаны, мы против вставки пользовательского html-кода туда, где нужен простой текст, и считаем, что, если нужно вставить html, то это должно быть явно указано, не на уровне магии, а символами по исходнику.
Для вставки html без escaping используется конструкция ecaml, выглядящая как
<%=raw выражение-которое-вставляем %>
Особо примечательно, что функция-помощник link_to "Текст ссылки" сама_ссылка
тоже должна быть вставлена с помощью <%=raw
(это такой токен, пробелов в нём
нет). Надеюсь, понятно, почему.