Книга: Программирование на языке Ruby
19.7.2. Использование erb
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.
- Запуск InterBase-сервера
- Расширенная установка InterBase-сервера
- Восстановление с использованием инструмента gbak
- Вызов хранимых процедур InterBase с использованием стандартного синтаксиса ODBC
- Использование системы Kerberos
- Создание CGI-приложений под ОС Linux с использованием InterBase API
- Использование основных компонентов InterBase eXpress (IBX)
- Работа с InterBase с использованием ODBC
- Совместное использование gds32.dll, InterBase.msg и mscvrt.dll
- Разработка клиентских приложений СУБД InterBase с использованием технологии Microsoft OLE DB
- Использование скриптов в клиентских приложениях базы данных InterBase
- Регистрация ТСР