logo
Программирование на языке Ruby

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).