Динамическое содержимое
В Rails есть два способа создания динамических шаблонов1. Один использует
технологию под названием Builder, которую мы рассмотрим в подразделе «Шаблоны
Builder» раздела 22.1. А второй, который мы рассмотрим здесь, заключается
во вставке кода Ruby непосредственно в шаблон. Вот поэтому-то мы и назвали
файл нашего шаблона hello.rhtml: суффикс .rhtml сообщает Rails, что нужно расширить
содержимое файла, используя систему под названием ERb (Embedded Ruby,
или вставка Ruby-кода).
ERb представляет собой фильтр, который создает на основе файла с расширением
.rhtml его преобразованную версию. На выходе в Rails чаще всего получается
HTML-код, но это может быть все, что угодно. Обычное содержимое проходит
через фильтр без изменений. Но содержимое, заключенное между группами символов
<%= и %>, интерпретируется как код Ruby и соответствующим образом
исполняется. Результат исполнения конвертируется в строку, которая замещает
в файле последовательность вида <%=. . .%>. Например, измените содержимое
файла hello.rhtml и включите в него следующий код:
Листинг файла erb/exl.rhtml
-
<И>Сложение: <%= 1+2 %> < / l i >
<И>Время через час: <%= 1. hour. f rora_now %>
Когда вы обновите экран браузера, шаблон сгенерирует следующий HTML-код:
<и\>
В окне браузера вы увидите нечто подобное:
• Сложение: 3.
• Объединение строк: cowboy.
• Время через час: Mon J an 23:33:20 +0200 2007
Следует добавить, что содержимое файлов с расширением .rhtml, заключенное
между группами символов <% и %> (без знака равенства), интерпретируется как
ша~ код Ruby, результат исполнения которого на выходе не замещает эту конст-
ше~ рукцию. Примечательно, что такая разновидность обработки может смешиваться
с кодом, не имеющим отношения к Ruby. Например, мы можем создать праздничную
версию файла кен- hello.rhtml:
<% 3.times do %>
Всем! />
<% end %>
С Новым годом!
В результате получится следующий код HTML:
Всем! />
Всем! />
Всем! />
С Новым годом!
Обратите внимание на то, как текст внутри Ruby-цикла посылается в выход-
ной поток при каждом проходе. Тут происходит нечто странное. Откуда же берутся
все эти пустые строки? Они попадают сюда из исходного файла. Если призадуматься,
то можно понять, что оригинальный файл содержал символ (или
символы) конца строки сразу же после группы символов %>, размещенных на
первой и третьей строках. Итак, инструкция <% 3.times do %> была убрана из
файла, но переход на новую строку остался. При каждом прохождении цикла
этот переход добавлялся в выходной файл наряду со всем текстом, находящемся
в строке Всем!. За счет этого перед каждым Всем! и появилась пустая строка.
Аналогично, за счет перехода на новую строку после инструкции <% end %> появилась
пустая строка между последним Всем! и строкой С Новым годом!.
Обычно на это не обращается внимания, поскольку при обработке HTML пустые
места игнорируются. Тем не менее, если вы воспользуетесь подобным шаблоном
для создания сообщений электронной почты или HTML-содержимого внутри
блоков, заключенных в теги <рге>, вам захочется убрать пустые строки. Вы
можете сделать это, заменив окончание последовательности с группы символов
%> на группу -%>. Знак «минус» подскажет Rails, что нужно убрать все символы
перехода на новую строку из выходной информации. Если мы добавим знак
минуса в строку 3. times
<% 3.times do -%>
Всем!<Ьг />
<% end %>
С Новым годом!
результат будет следующим:
Всем!<Ьг />
Всем!<Ьг />
Всем!<Ьг />
С Новым годом!
УПРОЩЕНИЕ РАЗРАБОТКИ
_______________________________________________________________________
В процессе разработки, которой мы до сих пор занимались, вы могли уже кое-что заметить. По
мере добавления кода нам не приходилось перезапускать работающее приложение. Все это
благополучно проходило в фоновом режиме, не отвлекая нашего внимания. И каждое вносимое
нами изменение становилось доступным, как только мы обращались к приложению через браузер.
Ну и что с того?
Оказывается, Rails, работающая под управлением диспетчера WEBrick, ведет себя достаточно
разумно. В режиме разработки (в отличие от режимов тестирования или использования) диспетчер
автоматически перегружает исходные файлы приложения, как только приходит новый
запрос. Таким образом, когда мы редактируем наше приложение, диспетчер обеспечивает запуск
самой последней версии. Для режима разработки это очень неплохое качество.
Тем не менее за такую гибкость поведения приходится платить — она приводит к небольшой
паузе между вводом URL и откликом приложения, которая вызвана тем, что диспетчер осуществляет
перезагрузку. Для разработки это вполне разумная цена, но при использовании готового
приложения такой режим будет неприемлем. Поэтому перед развертыванием приложения этот
режим отключается (см. главу 27, «Развертывание и эксплуатация»).
_______________________________________________________________________
Добавление знака «минус» в строку, содержащую инструкцию end
<% 3.times do -%>
Всем!<Ьг />
<% end -%>
С Новым годом!
приводит к избавлению от пустой строки перед строкой С Новым годом!:
Всем!<Ьг />
Всем!<Ьг />
Всем!<Ьг />
С Новым годом!
Вообще-то, подавление переходов на новую строку — больше дело вкуса, а не
потребностей. Тем не менее вам будет попадаться код Rails, в котором используется
знак «минус», поэтому лучше знать о том, к чему это приводит.
В следующем примере в теле цикла устанавливается значение переменной,
которое вставляется в текст при каждом проходе.
<% 3.downto(l) do I count| -%>
<%= count %>...
<% end -%>
Старт!
Браузер получит следующее:
3.. .
2...
1...
Старт!
У ERb есть еще одна неприятная особенность. Довольно часто значения, которыми
требуется заместить конструкцию вида <%=. . .%>, содержат знаки «меньше,
чем» и амперсанд, которые играют в HTML особую роль. Чтобы предотвратить
путаницу на странице (и, как мы увидим в главе 26, «Организация защиты
Rails-приложения», чтобы избежать возможных проблем безопасности), вам понадобится нейтрализовать эти символы. В Rails для этого имеется вспомогательный
метод — п. Он может вам еще не раз пригодиться при подстановке значений
з HTML-страницы.
Enail: <%= h("Ann & BUI " ) %>
В данном примере метод h предотвращает искажения выводимой в браузер
информации, которые могли произойти из-за специальных символов, содержащихся
в электронном адресе, — эти символы будут нейтрализованы и превращены
в HTML-элементы. Браузер будет видеть электронный адрес: Ann & Bill
<frazers@isp.email>, и специальные символы будут отображены соответствующим
образом.