Программирование на языке Ruby - [222]

Шрифт
Интервал

><%

> class PureView < Iowa::Component

>  def right_now

>   Time.now

>  end

> end

>%>

>

Автономный вид

>  <р>Текущее время @right_now.

>

Но, в отличие от Nitro, это работает только в том случае, когда для представления нет соответствующего компонента. Если имеются оба файла, то IOWA не станет анализировать код, встроенный в HTML-файл.

Шаблон может содержать циклы и условные предложения. Добавим такой метод в файл >Main.iwa:

>def after_dinner?

> Time.now.hour >19

>end

Тогда можно реализовать в >Main.html условную прорисовку с помощью элемента >if:

>

> <р>Обед закончен. Что на десерт?

>

Хороший вопрос! Что на десерт? Пусть IOWA и ответит. Мы поручим >Main.iwa подготовить меню десертов в виде массива:

>def desserts

> %w{

>  Пирожные

>  Печенье

>  Фрукты

>  Мороженое

> }

>end

А в файле >Main.html выведем его. Изменим содержимое элемента >if, включив список десертов:

><р>Обед закончен. Вот что мы можем предложить на десерт:

>

  • @dessert_item
  • >

>

>

Мы еще должны сообщить 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:

>

Тут происходит немало интересного; атрибут >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 хранится разметка:

>

Выбранный вами десерт

Десерт!

@details

>

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

19.7. Ruby и Web-сервер

На сегодняшний день одним из самых популярных Web-серверов является Apache. Если вы работаете с ним, то должны знать о модуле >mod_ruby, который описывается в разделе 19.7.1.

Еще одна полезная возможность на стороне сервера — встроенный Ruby; эту технологию поддерживают инструменты >erb (рассматриваемый ниже) и >eruby. Они позволяют встраивать код на Ruby в текст страницы (обычно HTML или XML), вследствие чего данные можно вставлять динамически. Данный подход описывается в разделе 19.7.2.

Некоторые разработчики реализовали Web-серверы, написанные целиком на Ruby. Естественно возникает вопрос: зачем писать новый Web-сервер, когда их уже и так существует немало — взять хотя бы тот же Apache?

Во-первых, есть ситуации, когда желательно иметь специализированный Web-сервер, например ради нестандартного способа обработки страниц, когда можно пожертвовать функциональностью ради скорости, или для автоматической трансляции специальной разметки в HTML.

Во-вторых, может возникнуть желание поэкспериментировать с поведением сервера и его взаимодействием с внешним кодом, например с CGI-программами. Возможно, у вас есть какие-то идеи относительно создания сервера приложений и среды разработки на стороне сервера. А все мы знаем, что Ruby прекрасно подходит для экспериментов.

В-третьих, иногда бывает разумно встроить Web-сервер в другое приложение. К этой возможности прибегают разработчики, желающие предоставить функциональность программной системы внешнему миру; протокол HTTP прост и четко определен, а Web-браузеры в качестве клиентов есть повсюду. Этот прием можно даже использовать для удаленной отладки, если система часто обновляет свое внутреннее состояние и делает его доступным встроенному серверу.

И последняя причина заключается в том, что небольшой автономный Web-сервер может упростить развертывание и конфигурирование. Например, перезапустить сервер для приложения Rails гораздо проще, если в этом качестве выступает WEBrick, а не Apache.


Рекомендуем почитать
Графика DirectX в Delphi

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


Вторая жизнь старых компьютеров

Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.


DirectX 8. Начинаем работу с DirectX Graphics

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

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