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

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

Жанры

Программирование на языке 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-заголовке.

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

Буря

Эренбург Илья Григорьевич
Проза:
военная проза
советская классическая проза
6.25
рейтинг книги
Буря

Краем глаза

Кунц Дин Рей
Детективы:
триллеры
8.62
рейтинг книги
Краем глаза

Американская фантастика

Гаррисон Гарри
Библиотека литературы США
Фантастика:
научная фантастика
7.00
рейтинг книги
Американская фантастика

Гримуар темного лорда VII

Грехов Тимофей
7. Гримуар темного лорда
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.25
рейтинг книги
Гримуар темного лорда VII

Дневник (1887-1910)

Ренар Жюль
Проза:
проза прочее
4.00
рейтинг книги
Дневник (1887-1910)

Цикл "Идеальный мир для Лекаря". Компиляция. Книги 1-30

Сапфир Олег
Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Цикл Идеальный мир для Лекаря. Компиляция. Книги 1-30

Экспансия (сборник)

Басов Николай Владленович
Шедевры отечественной фантастики
Фантастика:
научная фантастика
5.00
рейтинг книги
Экспансия (сборник)

Я до сих пор царь. Книга XXXII

Дрейк Сириус
32. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я до сих пор царь. Книга XXXII

Бандит

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

Дьявольская секта (Сборник)

Саган Франсуаза
Бестселлер
Детективы:
криминальные детективы
боевики
5.00
рейтинг книги
Дьявольская секта (Сборник)

Светоносец. Трилогия

Джонсон Оливер
Светоносец
Фантастика:
фэнтези
5.00
рейтинг книги
Светоносец. Трилогия

Лунный бассейн. Металлическое чудовище (сборник)

Меррит Абрахам Грэйс
2. Абрахам Меррит. Собрание сочинений в 5 томах
Фантастика:
ужасы и мистика
5.00
рейтинг книги
Лунный бассейн. Металлическое чудовище (сборник)

Последний реанорец. Том XII – Часть II

Павлов Вел
12. Высшая Речь
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний реанорец. Том XII – Часть II

Новая трилогия Возвышения. Том 1

Брин Дэвид
Шедевры фантастики
Фантастика:
научная фантастика
7.00
рейтинг книги
Новая трилогия Возвышения. Том 1