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

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

Жанры

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

19.7.2. Использование erb

Для начала договоримся о терминологии. Речь не идет о встраивании интерпретатора Ruby в электронные устройства, скажем, в телевизор или тостер. Мы говорим о встраивании кода на Ruby в текст.

Далее отметим, что встраивать Ruby-код в текстовые файлы можно несколькими способами. В этом разделе мы рассмотрим лишь самый общеупотребительный инструмент, а именно программу

erb
(автор Шуго Маэда).

Почему мы упоминаем подобный инструмент в связи с Web? Очевидно, потому, что чаще всего Ruby-код встраивается в HTML или XML-тексты.

Но можно придумать и другие применения. Например, в старомодных текстовых играх, или в каких-нибудь утилитах слияния почты, или как часть задания

cron
для динамического создания файла с «сообщением дня» (
/etc/motd
) в полночь. Не ограничивайте свое воображение. Ищите новые интересные применения
erb
и делитесь своими находками с сообществом. Большая часть примеров в этом разделе носит общий (и потому искусственный) характер, конкретно с HTML они почти не связаны.

Утилита

erb
— это просто фильтр или препроцессор. Для выделения кода, выражений и комментариев, написанных на Ruby, применяется специальная нотация, весь остальной текст передается без изменений.

Текст, который нужно специально обрабатывать, заключается в скобки

<%
и
%>
. Есть три вида такой нотации, отличающиеся первым символом внутри «тега».

Если первый символ — знак равенства (

=
), то содержимое рассматривается как выражение Ruby; результат его вычисления подставляется в текущее место файла, например:

This is <%= "ylno".reverse %> a test.

Do <%= "NOT".downcase %> be alarmed.

Если назвать этот файл

myfile.txt
, то для его фильтрации надо будет выполнить команду:

erb myfile.txt

Результат направляется на стандартный вывод:

This is only a test.

Do not be alarmed.

Комментарий вводится символом

#
:

Life <%# so we've heard %> is but a dream.

Как и следовало ожидать, комментарии игнорируются, то есть мы увидим такой результат:

Life is but a dream.

Все остальные символы после знака процента рассматриваются как часть кода. Все, что этот код выводит (не результат вычисления значения), помещается в текстовый поток. Для удобства восприятия рекомендую оставлять после процента пробел, хотя

erb
этого и не требует.

В следующем примере тег в первой строчке ничего не вставляет в текст, так как ничего не выводит. Во вторую же строку вставляется

42
, как и следовало ожидать.

Ответ равен <% "42" %>.

А точнее, ответ равен <% puts "42" %>.

Результат получается такой:

Ответ равен .

А точнее, ответ равен 42.

Фрагменты кода на Ruby не являются независимыми. Так, переменную, определенную в одном теге, можно использовать в следующем за ним.

<% x=3; y=4; z=5 %>

Если стороны треугольника равны <%=x%>, <%=y%> и <%=z%>,

мы знаем, что он прямоугольный, поскольку

<%= x*x %> + <%= y*y %> = <%= z*z %>.

Пробелы внутри тегов в последней строке необязательны, но с ними текст становится понятнее. Выводится следующий текст:

Если стороны треугольника равны 3, 4 и 5,

мы знаем, что он прямоугольный, поскольку

9 + 16 = 25.

Попробуйте сделать внутри тега синтаксическую ошибку. Вы обнаружите, что

erb
выдает очень подробное сообщение, в котором печатается сгенерированный код и максимально точно указывается место ошибки.

Что если включить «магическую строку» в сам текст в виде литерала? Экранирование с помощью обратной косой черты не работает. Мы рекомендуем такой способ:

В этой строке есть цепочка меньше-процент <%="<%"%>,

а в этой больше-процент <%="%"+">"%>.

Здесь мы видим <%="<%="%> и <%="<%#"%>.

Результат таков:

В этой строке есть цепочка меньше-процент <%,

а в этой больше-процент >%.

Здесь мы видим <% и <%#.

Включать открывающий тег немного проще, чем закрывающий. Объясняется это тем, что теги не могут быть вложенными, а программа

erb
недостаточно «умная», чтобы игнорировать закрывающий символ внутри строки.

Конечно, в

erb
есть кое-какие функции, «заточенные» под HTML. Для установки режима работы предназначен флаг
– M
, он может принимать значения
f
,
с
и
n
.

Режим

f
(фильтр) подразумевается по умолчанию, поэтому во всех предыдущих примерах мы не задавали флаг
– Mf
явно. В режиме
– Mc
(CGI) все ошибки печатаются в виде HTML. В режиме
– Mn
(NPH-CGI — без разбора заголовков) автоматически выводятся дополнительные HTTP-заголовки. В двух последних режимах для безопасности переменная
$SAFE
устанавливается в 1 (исходя из допущения, что это CGI-приложение, которое может вызвать враждебный пользователь). Флаг
– n
(и эквивалентный ему
– -noheader
) подавляет вывод CGI-заголовка.

Можно настроить сервер Apache так, что он будет распознавать страницы с встроенным кодом на Ruby. Для этого нужно ассоциировать тип

application/x-httpd-erb
с каким-нибудь расширением (было бы логично использовать
.rhtml
) и определить действие, которое ассоциирует этот тип с исполняемым файлом
eruby
. Более подробные сведения вы найдете в документации по Apache.

19.7.3. Сервер WEBrick

Авторами WEBrick являются Масаёси Такахаши (Masayoshi Takahashi) и Юзоу Готоу (Yuuzou Gotou) при участии многих других разработчиков. Это библиотека для создания полноценного HTTP-сервера; она входит в стандартный дистрибутив Ruby. Название происходит от слова «brick» (кирпич) — то есть подразумевается нечто небольшое, компактное и автономное.

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

Моров. Том 9

Кощеев Владимир
8. Моров
Фантастика:
альтернативная история
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Моров. Том 9

Мастер 10

Чащин Валерий
10. Мастер
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер 10

Шайтан Иван 4

Тен Эдуард
4. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
8.00
рейтинг книги
Шайтан Иван 4

Вернувшийся: Первые шаги. Том II

Vector
2. Вернувшийся
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Вернувшийся: Первые шаги. Том II

Обман

Джордж Элизабет
9. Инспектор Линли
Детективы:
криминальные детективы
7.00
рейтинг книги
Обман

Я не князь. Книга XIII

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

Слезы Эйдена 1

Владимиров Денис
11. Глэрд
Фантастика:
боевая фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Слезы Эйдена 1

Убивать чтобы жить 6

Бор Жорж
6. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 6

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

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

#Бояръ-Аниме. Газлайтер. Том 13

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

Лекарь Империи 5

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

Последний Герой. Том 5

Дамиров Рафаэль
5. Последний герой
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Последний Герой. Том 5

Я до сих пор князь. Книга XXII

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

Как я строил магическую империю 10

Зубов Константин
10. Как я строил магическую империю
Фантастика:
попаданцы
аниме
фантастика: прочее
5.00
рейтинг книги
Как я строил магическую империю 10