Чтение онлайн

ЖАНРЫ

Программирование на языке Ruby
Шрифт:

last_time = ""

def get_ramblings(instream)

 # He слишком красивый способ извлечь значение из первой пары

 # имя-значение. CGI сделал бы это за нас.

 data = ""

 if instream != nil

data = instream.split("&")[0].split(" = ")[1] || ""

 end

 return CGI.unescape(data)

end

def reverse_ramblings(ramblings)

 if ramblings == nil then return "" end

 chunks = ramblings.split(/\s+/)

 chunks.reverse.join(" ")

end

server = FastCGI::TCP.new('localhost', 9000)

begin

 server.each_request do |request|

stuff = request.in.read

out = request.out

out << "Content-type: text/html\r\n\r\n"

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 является Ruby on Rails (или просто Rails). Его автор Дэвид Хайнемайер Хансон (David Heinemeier Hansson).

В каркасе 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.

Схемы баз данных находятся в каталоге

db
. Инкрементные файлы миграции тоже попадут сюда.

В Rails есть концепция «обстраивания» (scaffolding), которая очень упрощает жизнь. Если ввести команду

script/generate scaffold Product
(
Product
— имя модели), то для таблицы
Products
(обратите внимание на множественное число) будет сгенерирована функциональность «создать-обновить-удалить».

Поделиться с друзьями: