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

на главную - закладки

Жанры

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

Если необходимо решение на основе шаблонов, возможно, подойдет библиотека Amrita . Обратите также внимание на Cerise — сервер приложений на базе Amrita .

Наверное, существуют и другие библиотеки. Если вы не нашли того, что искали, среди упомянутых здесь продуктов, обратитесь к поисковой машине или задайте вопрос в конференции.

19.1.1. Введение в библиотеку cgi.rb

Библиотека

cgi.rb
включена в стандартный дистрибутив Ruby. Ее функциональность в основном реализована в центральном классе
CGI
. Первое, что нужно сделать при работе с данной
библиотекой, — создать экземпляр этого класса.

require "cgi"

cgi = CGI.new("html4")

Инициализатор класса CGI принимает единственный параметр — уровень спецификации языка HTML, который должен поддерживаться методами генерации разметки, входящими в пакет CGI. Эти методы избавляют программиста от ручного написания длинных фрагментов экранированной разметки в достаточно простом коде на Ruby:

cgi.out do

 cgi.html do

cgi.body do

cgi.h1 { "Hello Again, "} +

cgi.b { cgi['name']}

end

 end

end

Здесь мы почти точно воспроизвели функциональность предыдущей программы, воспользовавшись библиотекой CGI. Как видите, класс

CGI
берет на себя заботу о разборе и сохранении параметров в структуре, напоминающей хэш. Поэтому, если указать URL
some_program.cgi?age=4
, значение параметра
age
можно получить как
cgi['age']
.

Отметим, что в данном примере нам понадобилось только значение, возвращаемое блоком; HTML-разметка строится постепенно и сохраняется, а не выводится сразу же. Это означает, что конкатенировать строки абсолютно необходимо, иначе мы увидели бы только последнюю вычисленную строку.

В классе

CGI
есть также удобные механизмы для кодирования строк URL и экранирования специальных символов в HTML и XML-коде. URL-кодированиеэто представление «небезопасных» символов с помощью других символов, допустимых в URL. В результате получаются странные строки, изобилующие знаками
%
, которые вы часто встречали в Web. На самом деле это просто шестнадцатеричные ASCII-коды символов с предшествующим знаком
%
.

require "cgi"

s = "This| is"^ (aT$test"

s2 = CGI.escape(s) # "This%7C+is%5E%28aT%24test"

puts CGI.unescape(s2) # Печатается "This| is"(aT$test"

Аналогично класс

CGI
позволяет экранировать части HTML или XML-текста, которые должны отображаться в браузере буквально. Например, без специальных мер строка
"<some_stuff>"
не будет показана в браузере именно в таком виде. Если необходимо показать саму разметку, например, в качестве примера в руководстве по HTML , то можно воспользоваться классом
CGI
для преобразования специальных символов:

require "cgi"

some_text = "<B>This is how you make text bold</B>"

translated = CGI.escapeHTML(some_text)

# "<B>This is how you make text bold</B>"

puts CGI.unescapeHTML(translated)

#
Печатается "<B>This is how you make text bold</B>"

19.1.2. Вывод и обработка форм

Наиболее распространенный способ взаимодействия с CGI-программой — форма. HTML-формы создаются с помощью специальных тегов, которые браузер представляет в виде элементов ввода данных. Подробное их обсуждение выходит за рамки данной книги, но существует немало книг и онлайновых руководств по этому предмету.

В классе

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

require "cgi"

def reverse_ramblings(ramblings)

 if ramblings[0] == nil then return " " end

chunks = ramblings[0].split(/\s+/)

 chunks.reverse.join(" ")

end

cgi = CGI.new("html4")

cgi.out do

 cgi.html do

cgi.body do

cgi.hi { "sdrawkcaB txeT" } +

cgi.b { reverse_ramblings(cgi['ramblings'])) +

cgi.form("action" => "/cgi-bin/rb/form.cgi") do

cgi.textarea("ramblings") { cgi['ramblings'] } + cgi.submit

end

end

 end

end

Здесь отображается многострочное поле ввода, текст в котором разбивается на слова и выводится в обратном порядке. Так, если набрать фразу «This is a test», то после обработки вы увидите «test a is This». Метод

form
класса
CGI
принимает параметр
method
— один из методов отправки формы, определенных в протоколе HTTP (
GET
,
POST
и т.д.). По умолчанию предполагается значение
POST
.

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

19.1.3. Куки

Мы уже упоминали, что HTTP — протокол без состояния. Это означает, что после того как сервер закончил обрабатывать запрос, он не может сказать, пришел ли следующий запрос от того же или какого-либо другого браузера. Тут-то и приходят на помощь куки (cookies) — способ, быть может, несколько грубоватый, сохранить состояние между последовательными запросами от одного и того же браузера.

Механизм куков работает следующим образом. Сервер посылает браузеру команду (в виде HTTP-заголовка) с просьбой сохранить пару имя-значение. Данные могут храниться в памяти или на диске. При каждом последующем запросе к любому серверу из домена, указанного в куке, браузер пошлет сохраненные данные в HTTP-заголовке.

Поделиться:
Популярные книги

Белые погоны

Лисина Александра
3. Гибрид
Фантастика:
фэнтези
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Белые погоны

Аристократ из прошлого тысячелетия

Еслер Андрей
3. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Аристократ из прошлого тысячелетия

Апокриф

Вайс Александр
10. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Апокриф

Я – Стрела. Трилогия

Суббота Светлана
Я - Стрела
Любовные романы:
любовно-фантастические романы
эро литература
6.82
рейтинг книги
Я – Стрела. Трилогия

Адвокат Империи 2

Карелин Сергей Витальевич
2. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 2

Поводырь

Щепетнов Евгений Владимирович
3. Ботаник
Фантастика:
фэнтези
6.17
рейтинг книги
Поводырь

Графиня с изъяном. Тайна живой стали

Лин Айлин
Фантастика:
фэнтези
героическая фантастика
киберпанк
5.00
рейтинг книги
Графиня с изъяном. Тайна живой стали

Последний Паладин. Том 13

Саваровский Роман
13. Путь Паладина
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 13

Командор космического флота

Борчанинов Геннадий
3. Звезды на погонах
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Командор космического флота

Черный рынок

Вайс Александр
6. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Черный рынок

Идеальный мир для Лекаря 26

Сапфир Олег
26. Лекарь
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 26

Развод. Без права на ошибку

Ярина Диана
Любовные романы:
современные любовные романы
короткие любовные романы
5.00
рейтинг книги
Развод. Без права на ошибку

Хозяйка забытой усадьбы

Воронцова Александра
5. Королевская охота
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка забытой усадьбы

Газлайтер. Том 18

Володин Григорий Григорьевич
18. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 18