Описание тега markaby
Маркаби (разметка как рубин)
Markaby - это библиотека для написания HTML-страниц на чистом Ruby. Это альтернатива ERb (который объединяет два языка). Он также служит заменой языкам шаблонов, которые смешивают динамически обработанные теги с HTML.
Использование Markaby в качестве плагина Ruby on Rails
Напишите шаблоны Ruby on Rails на чистом Ruby. Пример макета:
html do
head do
title 'Products: ' + action_name
stylesheet_link_tag 'scaffold'
end
body do
p flash[:notice], :style => "color: green"
self << content_for_layout
end
end
Использование Markaby в качестве класса Ruby
Маркаби легко вызывать из ваших классов Ruby.
require 'markaby'
mab = Markaby::Builder.new
mab.html do
head { title "Boats.com" }
body do
h1 "Boats.com has great deals"
ul do
li "$49 for a canoe"
li "$39 for a raft"
li "$29 for a huge boot that floats and can fit 5 people"
end
end
end
puts mab.to_s
Примечание о instance_eval
Markaby::Builder
класс отличается от нормального Builder
класс, так как он использует instance_eval
при запуске блоков. Это очищает внешний вид написанного вами кода Markaby. Если instance_eval
не был использован, код будет выглядеть так:
mab = Markaby::Builder.new
mab.html do
mab.head { mab.title "Boats.com" }
mab.body do
mab.h1 "Boats.com has great deals"
end
end
puts mab.to_s
Таким образом, преимущество заключается в чистоте вашего кода. Недостатком является то, что блок будет работать внутри Markaby::Builder
область действия объекта Это означает, что внутри этих блоков, self
будет вашим Markaby::Builder
объект. Когда вы используете переменные экземпляра в этих блоках, они будут переменными экземпляра Markaby::Builder
объект.
Это не влияет на пользователей Ruby on Rails, но при использовании в обычном коде Ruby это может немного дезориентировать. Рекомендуется поместить свой код Markaby в модуль, где он ни с чем не конфликтует.
Примечание о помощниках по Ruby on Rails
При использовании в шаблонах Ruby on Rails вспомогательный объект Ruby on Rails передается в Markaby::Builder
, Когда вы вызываете вспомогательные методы внутри Markaby, выходные данные этих методов будут выводиться в поток. Это невероятно удобно, поскольку большинство помощников Ruby on Rails выводят теги HTML.
head do
javascript_include_tag 'prototype'
autodiscovery_link_tag
end
Тем не менее, некоторые методы предназначены для String
который вы можете использовать в другом месте. Позвоните @helpers
объект с методом, и вы получите String обратно, и ничего не будет выведено.
p "Total is: #{@helper.number_to_human_size @file_bytes}"
И наоборот, вы можете вызывать переменные экземпляра из вашего контроллера, используя метод, и его значение будет возвращено, ничего не будет выведено.
# Inside imaginary ProductController
def list
@products = Product.find :all
end
# Inside app/views/product/list.mab
products.each do |product|
p product.title
end
Быстрый Тур
Если вы погрузитесь прямо в Markaby, это, вероятно, будет иметь смысл, но вы, вероятно, столкнетесь с несколькими проблемами. Помните об этих указателях, и все будет хорошо.
Элемент Классы
Классы элементов могут быть добавлены путем подключения методов к элементам контейнера:
div.entry do
h2.entryTitle 'Son of WebPage'
div.entrySection %{by Anthony}
div.entryContent 'Okay, once again, the idea here is ...'
end
Что приводит к:
<div class="entry">
<h2 class="entryTitle">Son of WebPage</h2>
<div class="entrySection">by Anthony</div>
<div class="entryContent">Okay, once again, the idea here is ...</div>
</div>
ID элементов
Идентификаторы могут быть добавлены с помощью методов взрыва:
div.page!
div.content!
h1 "A Short Short Saintly Dog"
end
end
Что приводит к:
<div id="page">
<div id="content">
<h1>A Short Short Saintly Dog</h1>
</div>
</div>
Маркаби предполагает XHTML 1.0 Transitional
По умолчанию на выходе XHTML 1.0 Transitional. Чтобы сделать XHTML 1.0 Strict, попробуйте это:
xhtml_strict do
# innerds
end
Метод захвата
Хотите поймать блок HTML как строку и поиграть с ним немного? Используйте метод захвата.
Обычно используется для объединения блоков HTML:
div.menu! \
['5.gets', 'bits', 'cult', 'inspect', '-h'].map do |category|
capture { link_to category }
end.
join( " | " )
Тег! метод
Если вам нужно принудительно установить тег в любое время, позвоните tag!
с именем тега, за которым следуют возможные аргументы и блок. CssProxy
не будет работать с этой техникой.
tag! :select, :id => "country_list" do
countries.each do |country|
tag! :option, country
end
end
Более подробная информация о библиотеке доступна на странице Markaby Wikipedia, а также на странице документации проекта.