KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Хэл Фултон - Программирование на языке Ruby

Хэл Фултон - Программирование на языке Ruby

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Хэл Фултон, "Программирование на языке Ruby" бесплатно, без регистрации.
Перейти на страницу:

В основе Wee лежит идея компонентов. Они похожи на виджеты в графических интерфейсах. Компоненты легко поддаются повторному использованию, инкапсулируют состояние, представление и поведение, хотя все это можно делегировать внешним шаблонам или моделям.

19.5.1. Простой пример

Во время установки Wee создается генератор простых приложений, который, естественно, называется wee. Команда wee create my-demo создает подкаталог my-demo в текущем каталоге и записывает в него простое приложение на базе WEBrick.

Созданное приложение всего лишь подсчитывает, сколько раз пользователь щелкнул по ссылке. Файл run.rb на стороне сервера подготавливает компоненты приложения и главный класс, после чего запускает приложение под управлением сервера WEBrick.

require 'wee'

require 'wee/utils'

require 'wee/adaptors/webrick'


# Ваши компоненты.

require 'components/main'


app = Wee::Utils.app_for do

 Main.new.add_decoration(Wee::PageDecoration.new('Wee'))

end

Wee::Utils::autoreload_glob('components/**/*.rb')

Wee::WEBrickAdaptor.register('/арр' => app).start

Класс Main вызывается как главный компонент приложения. Каждый компонент должен реализовать метод render, порождающий разметку. Вызов метода add_decoration(Wee::PageDecoration.new('Wee')) изменяет конвейер построения страницы так, что результаты обращения к Main#render дополняются HTML-кодом заголовка и хвостовика.

Далее конфигурируется автоматическая перезагрузка файлов, чтобы можно было изменить код и проверить, как работает новая версия приложения, не перезапуская WEBrick. И наконец, запускается экземпляр сервера WEBrick, который обслуживает запросы к URL, начинающемуся с пути '/арр'. По умолчанию подразумевается порт 2000, но можно при запуске указать любой другой номер в качестве параметра:

Wee::WEBrickAdaptor.register('/арр' => арр).start(:Port => 8787 )

Компонент Main определяет метод render, который порождает разметку.

class Main < Wee::Component


 def initialize

  super()

  # Здесь должен быть ваш код инициализации...

 end


 def render

  r.anchor.callback(:click).with { r.h1("Welcome to Wee!") }

  r.text "#{ @clicks || 'No' } clicks"

 end


 def click

  @clicks = (@clicks || 0) + 1

 end


end

Wee позволяет пользоваться синтаксисом Ruby для генерации HTML-кода примерно так же, как библиотека XML Builder Джима Вайриха и генератор XML в Nitro. Однако в Wee можно еще связать ссылку с действием (в данном случае с методом click). Когда пользователь щелкает по ссылке, сгенерированной Wee, приложение понимает, что нужно вызвать метод click.

19.5.2. Ассоциирование состояния с URL

В примере выше отслеживается текущее значение переменной @click, но она не связывается с URL. Если вы запустите эту программу, что увидите, что Wee генерирует довольно длинный URL, который по сути является GUID'om (globally unique identifier, глобально уникальным идентификатором). URL остается таким же, если не считать завершающего символа косой черты и целого числа. При каждом щелчке по ссылке Welcome to Wee число увеличивается на единицу

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

Впрочем, это положение можно изменить, слегка модифицировав файл main.rb. Добавьте в метод Main такой код:

def backtrack_state(snap)

 super

 snap.add(self)

end

Теперь перезапустите приложение. Щелкнув несколько раз по ссылке, вручную измените URL в браузере так, чтобы повторно загрузилась предыдущая страница. Теперь счетчик должен показать то значение переменной @click, которое соответствует моменту генерации данного URL.

Чтобы проверить то же самое с использованием механизма продолжений Wee, добавьте после директив require в файл run.rb следующую строку:

require 'wee/continuation'

В Wee слишком много возможностей, чтобы рассмотреть их здесь подробно. Дополнительную информацию можно найти на следующих ресурсах:

• страница проекта Wee (http://rubyforge.org/projects/wee/);

• страница проекта Nemo (http://rubyforge.org/projects/nemo/):

• проект Seaside (http://seaside.st/)

Одна из интересных особенностей — возможность иметь вложенные компоненты и организовывать цепочки обязанностей, что позволяет собирать сайты из повторно используемых компонентов пользовательского интерфейса. Стоит также познакомиться с проектом Nemo — реализацией Mewa (Meta-level Architecture for Web Applications, метауровневая архитектура Web-приложений) на Wee.

19.6. Разработка Web-приложений с помощью IOWA

IOWA (Interpreted Objects for Web Applications — интерпретируемые объекты для Web-приложений) — это каркас, написанный Кирком Хейнсом (Kirk Haines). Он позволяет создавать повторно используемые, инкапсулированные Web-компоненты для генерации сайта.

19.6.1. Основные идеи IOWA

Приложение IOWA работает как фоновый процесс, который прослушивает сокет в ожидании запросов. IOWA включает различные адаптеры, так что источником запроса может быть CGI, Mongrel, WEBrick и т.д.

На домашней странице IOWA представлены хорошее объяснение архитектуры и учебное руководство, поэтому здесь мы приведем лишь краткий обзор основных особенностей.

Загрузить IOWA можно с сайта rubyforge.org. Gem-пакет будет подготовлен вместе с версией 1.0. Примеры, представленные в этом разделе, составлены на базе предварительной версии, доступной в виде zip- или tgz-файла.

В состав дистрибутива входит несколько примеров и тестов, демонстрирующих работу каркаса. Мы рассмотрим простое приложение, разработанное на основе этих примеров.

Для приложения IOWA нужен код, который запустит фоновый процесс, а в качестве фронтального процесса мы будем пользоваться встроенным сервером WEBrick. Сценарий арр.rb решает обе задачи:

require 'iowa_webrick'


class HWApplication < Iowa::Application

 self.daemonize = true

 attr_accessor :dbpool


 def initialize(*args)

  super

  Iowa.config[Iowa::Capplication][Iowa::Croot_url] = 'http://127.0.0.1:2000'

 end

end


Iowa.run

По умолчанию конфигурационные данные читаются из файла арр.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 следующего вида:

http://127.0.0.1:2000/main.html/6b38f6fb-4f087af7-ab6JaqUM9KyWE.a.1.7

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*