class ActionView::Base
Шаблон представления Base
Шаблоны представлений Action View могут быть написаны несколькими способами. Если файл шаблона имеет расширение .erb, то он использует систему шаблонов erubis, которая может встраивать Ruby в HTML-документ. Если файл шаблона имеет расширение .builder, то используется библиотека Jim Weirich's Builder::XmlMarkup.
Вы вызываете ERB с помощью встроенных конструкций, таких как <% %>, <% -%> и <%= %>. Тег <%= %> используется, когда требуется вывод. Рассмотрим следующий цикл для имён:
<b>Names of all the people</b> <% @people.each do |person| %> Name: <%= person.name %><br/> <% end %>
Цикл задан в обычных тегах встраивания <% %>, а имя написано с помощью тега вывода <%= %>. Обратите внимание, что это не просто рекомендация по использованию. Обычные функции вывода, такие как print или puts, не будут работать с шаблонами ERB. Поэтому это будет неправильно:
<%# WRONG %> Hi, Mr. <% puts "Frodo" %>
Если вам абсолютно необходимо писать изнутри функции, используйте concat.
Если на строке содержатся только пробелы, кроме тега, <% %> подавляют начальные и конечные пробелы, включая конечную новую строку. <% %> и <%- -%> одинаковы. Обратите внимание, что <%= %> и <%= -%> различны: только последний удаляет конечные пробелы.
Использование дочерних шаблонов
Использование дочерних шаблонов позволяет избежать утомительного дублирования и извлечь общие структуры отображения в общих шаблонах. Классический пример — использование заголовка и подвала (хотя способ Action Pack — использовать макеты):
<%= render "shared/header" %> Something really specific and terrific <%= render "shared/footer" %>
Как вы видите, мы используем теги вывода для методов render. Сам вызов render вернёт строку, содержащую результат рендеринга. Тег вывода запишет её в текущий шаблон.
Но вы не ограничены только статическими включениями. Шаблоны могут совместно использовать переменные, используя переменные экземпляра, определённые с помощью обычных тегов встраивания. Например так:
<% @page_title = "A Wonderful Hello" %> <%= render "shared/header" %>
Теперь заголовок может использовать переменную @page_title и использовать её для вывода тега заголовка:
<title><%= @page_title %></title>
Передача локальных переменных дочерним шаблонам
Вы можете передавать локальные переменные дочерним шаблонам, используя хеш, в котором имена переменных являются ключами, а объекты — значениями:
<%= render "shared/header", { headline: "Welcome", person: person } %> Теперь к ним можно обратиться в shared/header с помощью:
Headline: <%= headline %> First name: <%= person.first_name %>
Локальные переменные, передаваемые дочерним шаблонам, могут быть доступны как хеш с помощью local_assigns хеша. Это позволяет получить доступ к переменным следующим образом:
Headline: <%= local_assigns[:headline] %>
Это полезно в тех случаях, когда вы не уверены, была ли локальная переменная назначена. В качестве альтернативы, вы также можете использовать defined?
headline для проверки наличия переменной перед её использованием.
Кэширование шаблонов
По умолчанию Rails будет компилировать каждый шаблон в метод для его рендеринга. При изменении шаблона Rails будет проверять время изменения файла и перекомпилировать его в режиме разработки.
Библиотека Builder
Шаблоны Builder — более программируемая альтернатива ERB. Они особенно полезны для генерации XML-контента. Объект XmlMarkup с именем xml автоматически становится доступным в шаблонах с расширением .builder.
Вот несколько основных примеров:
xml.em("emphasized") # => <em>emphasized</em>
xml.em { xml.b("emph & bold") } # => <em><b>emph & bold</b></em>
xml.a("A Link", "href" => "http://onestepback.org") # => <a href="http://onestepback.org">A Link</a>
xml.target("name" => "compile", "option" => "fast") # => <target option="fast" name="compile"\>
# NOTE: order of attributes is not specified.
Любой метод с блоком будет обрабатываться как XML-тег с вложенными метками в блоке. Например, следующее:
xml.div do xml.h1(@person.name) xml.p(@person.bio) end
произведёт что-то вроде:
<div> <h1>David Heinemeier Hansson</h1> <p>A product of Danish Design during the Winter of '79...</p> </div>
Полный пример RSS, используемый в Basecamp:
xml.rss("version" => "2.0", "xmlns:dc" => "http://purl.org/dc/elements/1.1/") do
xml.channel do
xml.title(@feed_title)
xml.link(@url)
xml.description "Basecamp: Recent items"
xml.language "en-us"
xml.ttl "40"
@recent_items.each do |item|
xml.item do
xml.title(item_title(item))
xml.description(item_description(item)) if item_description(item)
xml.pubDate(item_pubDate(item))
xml.guid(@person.firm.account.url + @recent_items.url(item))
xml.link(@person.firm.account.url + @recent_items.url(item))
xml.tag!("dc:creator", item.author_name) if item_has_creator?(item)
end
end
end
end
Дополнительную информацию о Builder можно найти в исходном коде.
Атрибуты
Публичные методы класса
# File actionview/lib/action_view/base.rb, line 174 def cache_template_loading ActionView::Resolver.caching? end
# File actionview/lib/action_view/base.rb, line 178 def cache_template_loading=(value) ActionView::Resolver.caching = value end
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.