Статьи

Рубин для новичков: камень наклона

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 для встраивания шаблона для конкретной страницы в оболочку всего сайта. Например, мы можем разделить наш шаблон выше на два файла:

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>
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; если вы хотите узнать больше, я рекомендую вам ознакомиться с документацией .