Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на языке Ruby.docx
Скачиваний:
19
Добавлен:
06.09.2019
Размер:
1.74 Mб
Скачать

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.</p>

 </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>

<p>

Мы еще должны сообщить IOWA, что выводить на каждой итерации, поэтому в конце файла Main.iwa после определения класса добавим раздел определения связей:

<?

 dessert_list {

 item = dessert_item

 list = desserts

} ?>

Тем самым производится связывание списка dessert_list в шаблоне. На каждой итерации элемент списка заполняется из переменной dessert_item, а данные в целом поступают от метода компонента desserts.

19.6.3. Передача управления компоненту

Бывает полезно разнести логику приложения по нескольким классам компонентов. Мы видели, как можно отобразить URL на компоненты. Имеется также способ передать управление, не изменяя базового пути в URL.

Добавим в файл Main.iwa метод для обработки щелчка по ссылке в меню десертов:

def dessert_choice

 new_page = page_named( 'DessertChoice')

 new_page.choice = @dessert_item

 yield new_page

end

Также изменим цикл формирования списка десертов в Main.html:

<ul oid="dessert_list">

 <li><a oid= 'dessert_choice'>@dessert_item</a></li>

</ul>

Тут происходит немало интересного; атрибут oid элемента ul управляет формированием цикла, а такой же атрибут элемента а создает специальную ссылку на только что добавленный методdessert_choice. Для довершения дела странице передается еще и текст ссылки (хотя и несколько загадочным способом). Метод dessert_choice сам по себе короткий, в нем вызывается методpage_named для создания экземпляра еще одного класса компонента DessertChoice. Для передачи выбранного десерта вызывается метод choice=. Затем yield передает управление новому компоненту.

Новый компонент также определяется с помощью пары файлов с расширениями .iwa и .html. Вот код класса:

class DessertChoice < Iowa::Component

 attr_accessor :choice

 def details

  "Детали #{@choice} нужно было брать из базы данных."

 end

end

А в файле DessertChoice.html хранится разметка:

<html>

 <head><title>Выбранный вами десерт</title></head>

 <body>

  <h1>Десерт!</h1>

  <p>@details</p>

 </body>

</html>

Об IOWA можно было бы рассказывать еще долго. Для получения дополнительной информации зайдите на домашнюю страницу IOWA (http://enigo.com/proiects/iowa/) или на страницу проекта IOWA на сайте RubyForge (http://rubyforge.org/projects/iowa).