По умолчанию конфигурационные данные читаются из файла
арр.cnf
в текущем каталоге. Вот как выглядит наш файл:
socket:
hostname: localhost
path: ..
logging:
basedir: ../log
minlevel: 0
maxsize: 10000000
maxage: 86400
application:
daemonize: false
sessioncache:
class: LRUCache
maxsize: 20
ttl: 3600
dispatcher:
class: StandardDispatcher
policy:
class: iowa/Policy
Этот
файл, записанный в формате YAML, содержит различную информацию о желаемом поведении IOWA. Необходим и еще один конфигурационный файл
mapfile.cnf
, в котором описывается, как запросы отображаются на компоненты. Вот пример такого файла, содержащий всего одну строку:
/main.html: Main
Запросы к IOWA обычно обслуживаются комбинацией HTML-шаблонов и компонентов IOWA. Парные файлы имеют одинаковое базовое имя, но разные расширения. Принимаемый по умолчанию шаблон/объект называется
Main
, так что приложение состоит из файлов
Main.html
и
Main.iwa
.
Файлы с расширением
.iwa
представляют собой программы на Ruby; такое расширение в IOWA используется для того, чтобы отличить их от прочего кода, который может входить в состав приложения. Эти файлы играют ту же роль, что классы контроллеров в Nitro и Rails. Определенные в классе компонента методы доступны из соответствующего HTML-файла.
Демонстрационный файл
Main.html
выглядит так:
<html>
<head><title>Текущее время...</title></head>
<body>
<р>Текущее время @now.
<р>Счетчик равен @count.
<а oid="reload">RELOAD</a>
</body>
</html>
В шаблонах IOWA можно смешивать обычный HTML-код и переменные экземпляра компонента. Отметим, что переменные необязательно «интерполировать» обычным способом, достаточно просто включить их в разметку.
Имеется также специальная переменная
oid
, IOWA использует ее для динамического изменения шаблона в процессе прорисовки. В нашем примере с ее помощью создается ссылка на метод reload из класса компонента, определенного в файле
Main.iwa
. Если задержать мышь над этой ссылкой в полученной странице (или посмотреть ее исходный текст), то вы увидите URL следующего вида:
Такие URL позволяют IOWA отслеживать состояние сеанса. Если несколько раз щелкнуть по ссылке, то вы увидите, что URL изменяется. Если вручную восстановить предыдущее значение, вы получите состояние сеанса, соответствующее URL.
В данном случае состояние — это значение переменной экземпляра
@count
. Вот как выглядит файл
Main.iwa
:
class Main < Iowa::Component
attr_accessor :count
def awake
@count = 0
end
def setup
@count += 1
end
def now
Time.now.asctime
end
end
19.6.2.
Шаблоны в IOWA
Большинство Web-приложений только выигрывает от разделения кода и шаблонов представления, но IOWA, как и Nitro, позволяет вообще обходиться без компонентов и помещать весь код на Ruby в представление. Ниже приведен файл PureView.html, содержащий как код класса, так и HTML-разметку:
<%
class PureView < Iowa::Component
def right_now
Time.now
end
end
%>
<html>
<head><titlе>Автономный вид</title></head>
<body>
<р>Текущее время @right_now.
</body>
</html>
Но, в отличие от Nitro, это работает только в том случае, когда для представления нет соответствующего компонента. Если имеются оба файла, то IOWA не станет анализировать код, встроенный в HTML-файл.
Шаблон может содержать циклы и условные предложения. Добавим такой метод в файл
Main.iwa
:
def after_dinner?
Time.now.hour >19
end
Тогда можно реализовать в
Main.html
условную прорисовку с помощью элемента
if
:
<if oid='after_dinner?'>
<р>Обед закончен. Что на десерт?</р>
</if>
Хороший вопрос! Что на десерт? Пусть IOWA и ответит. Мы поручим
Main.iwa
подготовить меню десертов в виде массива:
def desserts
%w{
Пирожные
Печенье
Фрукты
Мороженое
}
end
А в файле
Main.html
выведем его. Изменим содержимое элемента
if
, включив список десертов:
<р>Обед закончен. Вот что мы можем предложить на десерт:</р>
<ul oid="dessert_list">
<li>@dessert_item</li>
</ul>
</if>
Мы еще должны сообщить IOWA, что выводить на каждой итерации, поэтому в конце файла
Main.iwa
после определения класса добавим раздел определения связей: