Ruby — один из самых популярных языков, используемых в сети. Здесь мы начали новую сессию на Nettuts +, которая познакомит вас с Ruby, а также с отличными фреймворками и инструментами, которые сопровождают разработку на Ruby. В этом выпуске мы рассмотрим Tilt , всеобъемлющий гем-оболочку для шаблонных движков Ruby.
Видеоурок
Шаблоны рендеринга
Если вы использовали веб-фреймворк Ruby — например, Rails и Sinatra — вы, вероятно, знакомы хотя бы с одним из множества доступных шаблонизаторов: я собираюсь рассказать о таких опциях, как ERB или Haml. При использовании их в контексте фреймворка это довольно просто … но иногда они кажутся очень встроенными; Что делать, если вы хотите использовать их в своем собственном проекте? Есть ли простой способ использовать их полезность?
Введите камень наклона . Считается, что это «тонкий интерфейс для множества различных шаблонных движков Ruby», и вы обнаружите, что это делает рендеринг шаблонов быстрым.
Конечно, мы установим его в первую очередь.
1
|
gem install tilt
|
Если вы не используете RVM ( которым вы должны быть ), возможно, вам придется запускать его с правами суперпользователя ( sudo
).
Конечно, вам нужно начать с шаблона для визуализации. Мы сделаем это просто:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
<!DOCTYPE html>
<html lang=»en»>
<head>
<meta charset=»UTF-8″ />
<title><%= title %></title>
</head>
<body>
<h2>A few of the Tuts+ Sites</h2>
<ul>
<% sites.each do |name, link|
<li><a href=»<%= link %>»> <%= name %></a></li>
<% end %>
</ul>
</body>
</html>
|
Сохраните это в tutsplus.erb
. Обратите внимание, что текст заголовка будет вставлен вместе с Ruby, а также список сайтов. Теперь давайте представим это. Мы сделаем это следующим образом (сохраните в using_tilt.rb
):
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
require ’tilt’
sites = {
«Nettuts+» => «http://net.tutsplus.com»,
«Psdtuts+» => «http://psd.tutsplus.com»,
«Mobiletuts+» => «http://mobile.tutplus.com»,
«Audiotuts+» => «http://audio.tutsplus.com» }
context = Object.new
def context.title
«Tuts+ Sites»
end
template = Tilt::ERBTemplate.new(«tutsplus.erb»)
File.open «sites.html», «w» do |file|
file.write template.render(context, sites: sites )
end
|
Конечно, мы начинаем с требования наклона. Затем мы создаем наши данные для шаблона: простой хеш, а также простой ванильный объект. Мы даем объекту одно свойство: title
. Затем мы создаем наш шаблон объекта. Здесь мы создаем экземпляр класса Tilt::ERBTemplate
но вся суть Tilt в том, что вы можете использовать любой движок шаблонов, какой захотите: например, вы можете использовать Tilt::HamlTemplate
, Tilt::SassTempalte
(для CSS), Tilt::CoffeScriptTemplate
(для CoffeeScript) или любой другой поддерживаемый движок шаблонов, который вы хотите. Однако важно отметить, что Tilt — это просто оболочка : вам нужна соответствующая библиотека для движка шаблонов, который вы хотите использовать. Таким образом, если вы хотите использовать экземпляр Tilt::HamlTemplate
, вам необходимо require 'haml'
. Вы можете увидеть, какие библиотеки требуются для каждого механизма шаблонов в файле Readme .
Наконец, мы открываем файл, в который хотим записать вывод. HTML (или CSS, или JavaScript, в зависимости от используемого вами шаблона и движка) будет возвращен из метода render
объекта шаблона. Метод render
принимает два параметра. Первый — это объект контекста: все свойства этого объекта будут доступны как переменные в шаблоне. Таким образом, наше свойство context.title
будет доступно как title
в шаблоне. Если есть какие-либо другие значения, которые вы хотите передать в шаблон, передайте их как часть второго параметра, который является хешем.
Итак, мы можем запустить этот скрипт в командной строке:
1
|
ruby using_tilt.rb
|
Теперь посмотрите в каталог, в котором вы sites.html
эти файлы: вы должны увидеть файл sites.html
. Если вы посмотрите его, вы обнаружите, что шаблон был обработан:
Уступка для большей силы
С Tilt вы можете делать более сложные вещи, если передаете блок методу render
.
1
2
3
|
Tilt::ERBTemplate(‘other.erb’).render(context, other_params) {
«some text»
}
|
Внутри вашего шаблона вы можете yield
блоку; все, что возвращается из блока, будет вставлено в этот момент в шаблоне.
Хотя вы, конечно, можете просто передать строку через блок, как указано выше, есть более интересный вариант использования. Недавно я использовал эту функциональность в Tilt для встраивания шаблона для конкретной страницы в оболочку всего сайта. Например, мы можем разделить наш шаблон выше на два файла:
layout.erb
01
02
03
04
05
06
07
08
09
10
|
<!DOCTYPE html>
<html lang=»en»>
<head>
<meta charset=»UTF-8″ />
<title><%= title %></title>
</head>
<body>
<%= yield %>
</body>
</html>
|
sites.erb
1
2
3
4
5
6
|
<h2>A few of the Tuts+ Sites</h2>
<ul>
<% sites.each do |name, link|
<li><a href=»<%= link %>»> <%= name %></a></li>
<% end %>
</ul>
|
Теперь, чтобы отобразить нашу страницу, мы можем сделать это:
1
2
3
4
5
6
7
|
template = Tilt::ERBTemplate.new(«layout.erb»)
File.open «sites.html» do |file|
file.write template.render(context) {
Tilt::ERBTemplate.new(«sites.erb»).render(Object.new, sites: sites)
}
end
|
Обратите внимание, что, поскольку у нас не было объекта, который мы хотели бы использовать в качестве объекта контекста, мы просто передали простой ванильный пустой объект Ruby. HTML- sites.erb
возвращаемый при рендеринге sites.erb
будет вставлен туда, где находится ключевое слово yield
. Если вы запустите приведенный выше код, вы должны увидеть тот же вывод, что и раньше.
Использование других параметров
Вы заметите, что до сих пор нам приходилось выбирать механизм шаблонов, который мы хотим использовать при создании объекта подкласса Tilt. Однако Tilt распознает расширение файла шаблона, который вы передали, поэтому вам не нужно явно выбирать движок: он выберет правильный, основываясь на расширении файла:
1
2
3
|
t = Tilt.new «tutsplus.erb»
t.class # => Tilt::ERBTemplate
|
Если по какой-то причине ваши шаблоны имеют расширение файла, которое отличается от ожидаемого в Tilt, вы можете зарегистрировать это:
1
2
3
4
5
|
Tilt.register Tilt::ERBTemplate, «some_extension»
t = Tilt.new «my_template.some_extension»
t.class # => Tilt::ERBTemplate
|
Узнать больше
Есть еще несколько нишевых вещей, которые может делать Tilt; если вы хотите узнать больше, я рекомендую вам ознакомиться с документацией .