Spec-Zone.ru › Ruby on Rails 4.1

класс ActionView::Base

Родитель:
Объект
Включенные модули:
ActionView::Helpers, ERB::Util, ActionView::Контекст

Представление действия Базовый

Шаблоны представления действия могут быть написаны несколькими способами. Если файл шаблона имеет расширение .erb , он использует смесь ERB (включённый в 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 %>

Если вам нужно определить, была ли локальная переменная присвоена значение в конкретном вызове render, вам нужно использовать следующий шаблон:

<% if local_assigns.has_key? :headline %>
  Headline: <%= headline %>
<% end %>

Проверка с использованием 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 &amp; 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 можно найти на сайте builder.rubyforge.org.

Атрибуты

view_renderer[RW]

Публичные методы класса

cache_template_loading() Показать исходный код
# File actionview/lib/action_view/base.rb, line 166
def cache_template_loading
  ActionView::Resolver.caching?
end
cache_template_loading=(value) Показать исходный код
# File actionview/lib/action_view/base.rb, line 170
def cache_template_loading=(value)
  ActionView::Resolver.caching = value
end

© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API