#{@title}
#{@author}
Page last updated: #{@last_update}
Все содержимое элемента Layout
вставляется в переменную content
в файле layout.xhtml
. Элементы могут принимать параметры; атрибут title в открывающем теге Layout
становится значением переменной экземпляра @title
в файле layout.xhtml
.
Вам это напоминает вызов метода с передачей ему аргументов? Так оно и есть. Мы можем определить разметку в виде класса Ruby ( src/element/layout2.rb
):
require 'nitro/element'
class Layout2 < Nitro::Element
def render
%^
body {
background-color: white; font-family: sans-serif;
}
#{content}
^
end
end
А затем изменим файл find.xhtml
, воспользовавшись элементом Layout2
(нужно еще будет затребовать класс нового элемента в файле run.rb
). Элементы могут содержать другие элементы, так что виды можно собирать из повторно используемых компонентов.
Часто встречаются большие фрагменты кода, содержащие логику, общую для нескольких приложений. Например, во многих Web-приложениях есть понятие учетной записи пользователя и авторизации. Чем заново писать код для каждой такой программы, можно включить уже готовый: это сэкономит время и упростит сопровождение.
Такой вид повторного использования называется частью. Часть (part) — это, по существу, мини-сайт, реализующий одну конкретную функцию. (В дистрибутив Nitro входит одна такая часть под названием Admin
.) Код в таком подсайте не нуждается в отдельном файле run.rb
, хотя включать его полезно, если вы хотите, чтобы часть могла выполняться автономно в демонстрационных целях.
Естественно, части хранятся в папке part
. Пусть имеется некий код аутентификации пользователя, который можно использовать повторно. Тогда дерево частей приложения могло бы выглядеть так:
/part/users
/part/users.rb
/part/users/public/
/part/users/controller.rb
/part/users/model/user.rb
/part/users/model/acl.rb
/part/users/template/login.xhtml
/part/users/template/form.xinc
/part/users/run.rb
Главный файл run.rb
мог бы включить такую часть с помощью одной директивы require
:
require 'part/users'
Теперь Nitro будет рассматривать весь код в каталоге part/users
, как если бы он находился в дереве исходных текстов главного приложения. Поиск шаблонов начинается в папке template приложения и продолжается в подкаталогах каталога part
. Если вы хотите переопределить шаблон, поставляемый вместе с частью, то нужно просто поместить замещающий вариант в соответствующий подкаталог папки template
.
Часто приложение должно отображать повторяющиеся данные; обычно они оформлены в виде HTML-таблицы в шаблоне. Если число строк заранее не известно, то придется обойти какой-то набор.
Можно встроить код Ruby непосредственно в шаблон, но Nitro предлагает специальный механизм конвейерной компиляции, чтобы упростить программирование типичных логических конструкций.
Конвейерная компиляция — это последовательность преобразований, которым подвергаются шаблоны по мере объединения в действия. Существуют классы преобразования для различных задач, в частности статического включения файлов, XSLT-преобразований и локализации. Класс Morphing
исследует разметку в шаблоне и ищет специальные атрибуты, которые обозначают различные преобразования.
В нашем демонстрационном приложении данных мало, но если представить себе много авторов, каждый из которых написал несколько книг, то можно было бы показать список книг данного автора. Метод контроллера поместил бы в переменную @books
список книг, а часть шаблона для обхода этого цикла могла бы выглядеть так:
Books by #{@author}
Класс Morphing
находит атрибут each элемента li и преобразует его в следующий код:
#{book.title}
Порожденная таким образом разметка передается следующему этапу конвейера.
Точно так же для повтора элемента можно использовать атрибут times
. Например, фрагмент
будет преобразован в следующий код:
В Nitro слишком много различных механизмов, чтобы все их можно было рассмотреть здесь. Но в этом разделе мы упомянем некоторые особенно приятные «вкусности».
В состав Nitro входит вспомогательный код, позволяющий использовать многочисленные библиотеки JavaScript, которые поддерживают различные формы DHTML и Ajax. Для облегчения интеграции в Nitro применяется высокоуровневый синтаксис. Например, в дистрибутиве Nitro есть пример поиска по сайту Flickr и вывода уменьшенных изображений. Текстовое поле для ввода тегов поиска поддерживает технологию Ajax, что достигается следующей разметкой:
Читать дальше
Конец ознакомительного отрывка
Купить книгу