stuff = request.in.read
out = request.out
out << 'Content-type: text/html
'
out << <<-EOF
<html>
<head><titlе>Отражатель текста</title></head>
<h1>sdrawkcaB txeT</h1>
<i>Вы перед этим сказали: #{last_time}</i><BR>
<b>#{reverse_ramblings(get_ramblings(stuff))}</b>
<form method='POST' action='/fast/serv.rb'>
<textarea name='ramblings'>
</textarea>
<input type='submit' name='submit'>
</form>
</body></html>
EOF
last_time = get_ramblings(stuff)
request.finish
end
ensure
server.close
end
Сразу же бросается в глаза (если вы читали предыдущий раздел) то, что в FastCGI приходится вручную делать кое-какие вещи, которые были не нужны при работе с библиотекой CGI
. Во-первых, «зашивание» в код экранированного HTML-кода. Во-вторых, метод get_ramblings
, который сам разбирает входные данные и возвращает нужное значение. Кстати, этот код будет работать только для POST-запросов — еще одно удобство, утраченное с отказом от библиотеки CGI.
Но вместе с тем у FastCGI есть и достоинства. Мы не проводили замеров, но — как следует из самого названия — FastCGI быстрее CGI. Вместо накладных расходов на создание нового процесса мы просто открываем соединение с портом 9000 на локальной машине (FastCGI::TCP.new('localhost', 9000)
). Кроме того, в переменной last_tim
e хранится часть состояния сеанса — вещь, невозможная в традиционной технологии CGI.
Отметим также, что эти библиотеки можно до определенного предела «смешивать». Вспомогательные функции из cgi.rb
, например метод CGI.escapeHTML
, можно использовать автономно (не делая библиотеку основой приложения). Тогда предыдущий пример оказался бы несколько проще для восприятия.
19.3. Ruby on Rails
В сообществе пользователей Ruby одним из самых широко известных каркасов для Web является
В каркасе Rails широко используются динамические свойства Ruby. У него также есть собственная философия, направленная на быструю разработку Web-приложений.
Rails хорошо известен и прекрасно документирован. В этой книге мы рассмотрим его лишь поверхностно.
19.3.1. Принципы и техника
Каркас Rails построен на основе паттерна Модель-Вид-Контроллер (Model-View-Controller — MVC). Каждое приложение естественно разбивается на модели (моделирующие предметную область), виды (с помощью которых информация представляется пользователю и организуется возможность взаимодействия) и контроллеры (играющие роль арбитров между моделями и видами).
В основу поведения Rails как каркаса положены определенные принципы. Один из них — «принцип минимизации кода»: не пишите код для связывания одного с другим, если такое связывание можно организовать автоматически.
С ним также связан принцип «примата соглашений над конфигурацией». Придерживаясь ряда заранее оговоренных стилей кодирования и именования, можно обойтись почти без конфигурирования (и приблизиться к идеальной среде с «нулевым конфигурированием»).
Rails прекрасно справляется с автоматизацией не слишком сложных задач. Если это имеет смысл, он сам генерирует код, избавляя программиста от необходимости писать его вручную.
Web-приложения часто хранят данные в базе, и Rails обеспечивает бесшовную интеграцию с базой данных. У Web-каркасов наблюдается тенденция проявлять «склонность» к какому-то конкретному объектно-реляционному отображению (object-relational mapper, ORM), и Rails — не исключение. Стандартным для Rails является отображение ActiveRecord, которое мы рассматривали в главе 10.
Базы данных описываются в файле config/database.yaml
— одном из немногих необходимых конфигурационных файлов (конечно же, в формате YAML). В нем перечислены три разных базы данных: для разработки, для тестирования и для промышленной эксплуатации. На первый взгляд, это перебор, но в действительности такая схема оказывается очень удобной.
Rails генерирует для вас пустые модели и контроллеры. В ходе редактирования моделей вы определяете связи между таблицами базы данных с помощью таких методов, как has_many
и belongs_to
(на самом деле их гораздо больше). Поскольку между моделями и таблицами есть соответствие, то написанный вами код заодно определяет и связи между самими моделями. Для контроля данных служат такие методы, как validates_presence_of
(проверяет, что данные присутствуют) и validates_uniqueness_of
(проверяет, что данные уникальны).
В результате создания приложения Rails командой вида rails appname
вы получаете каталог appname
с такой структурой:
арр
controllers
helpers
models
views
config
db
doc
lib
log
public
script
test
vendor
Большая часть кода находится в каталоге арр
. Как видите, сама его структура следует паттерну MVC.