Skip to content
Dmitry Grebeniuk edited this page Feb 5, 2014 · 2 revisions

Представления, они же шаблоны

Где расположены?

Шаблоны располагаются в файлах proj/app/views/имя_контроллера/имя_шаблона.html.eml. На данный момент только ecaml для шаблонов, а шаблоны генерируют только html. Конечно, будет расширяться по нужде.

Как рендерить шаблон из контроллера?

Действие контроллера по своему завершению выдаёт http-ответ. Чтобы выдать ответ, сгенерированный каким-либо шаблоном, в качестве возвращаемого действием значения можно написать

Имя_контроллера.Имя_шаблона.render <окружение>

Окружение -- это такой окамловский объект, который в своих методах хранит значения, требуемые как самому шаблону, так и вызываемым из него шаблонам.

Объекты были выбраны за замечательные возможности структурной подтипизации, в других языках известной как duck typing. Нет нужды объявлять типы всех методов, требуемых шаблону, достаточно просто предоставить их. Или словить ошибку компиляции, если чего-то не хватает.

Как рендерить шаблон из шаблона?

На низком уровне, без сахара, это так:

<% <имя_контроллера>_<имя_шаблона> env buf %>

Да, без модулей, некрасиво. Но иначе не получается, учитывая возможные взаимно-рекурсивные зависимости между шаблонами.

Аргумент env -- окружение для шаблона, который будем рендерить.

Аргумент buf -- буфер (с типом Buffer.t), в который рендерится текущий шаблон.

Прозреваю, что это весьма неудобный способ рендерить шаблон, поэтому кое-что будет исправлено кодогенерацией. Например, для выборочного изменения env без ручного копирования всех методов, кроме тех, которые требуют изменения.

Layout?

Шаблоны обычно рендерятся в пределах какого-то шаблона, специфичного для веб-приложения. Это называется layout. Они хранятся в proj/app/views/layouts/имя_layout'а.html.eml. Они содержат вызов render_template () для непосредственного рендеринга шаблона, вложенного в этот layout.

А для выбора нужного layout'а -- из контроллера вызываем

Имя_контроллера.Имя_шаблона.render ~layout:Layout.имя_layout'а <окружение>

либо

Имя_контроллера.Имя_шаблона.render ?layout:None <окружение>

для рендеринга просто шаблона, без layout'а.

html vs text

Мы серьёзные пасаны, мы против вставки пользовательского html-кода туда, где нужен простой текст, и считаем, что, если нужно вставить html, то это должно быть явно указано, не на уровне магии, а символами по исходнику.

Для вставки html без escaping используется конструкция ecaml, выглядящая как

<%=raw выражение-которое-вставляем %>

Особо примечательно, что функция-помощник link_to "Текст ссылки" сама_ссылка тоже должна быть вставлена с помощью <%=raw (это такой токен, пробелов в нём нет). Надеюсь, понятно, почему.