Spec-Zone.ru › Ruby on Rails 4.2

модуль ActionView::Helpers::CacheHelper

Общедоступные методы экземпляров

cache(name = {}, options = nil) { || ... } Показать исходный код
# File actionview/lib/action_view/helpers/cache_helper.rb, line 113
def cache(name = {}, options = nil, &block)
  if controller.respond_to?(:perform_caching) && controller.perform_caching
    safe_concat(fragment_for(cache_fragment_name(name, options), options, &block))
  else
    yield
  end

  nil
end

Этот помощник предоставляет метод для кэширования фрагментов представления, а не всего действия или страницы. Эта техника полезна для кэширования таких элементов, как меню, списки новых тем, статические фрагменты HTML и т. д. Этот метод принимает блок, содержащий содержимое, которое необходимо кэшировать.

Лучший способ использования - это использование кэширования на основе ключей поверх кэш-хранилища, такого как Memcached, которое автоматически удалит старые записи. Для получения дополнительной информации о кэшировании на основе ключей см.: signalvnoise.com/posts/3113-how-key-based-cache-expiration-works

При использовании этого метода укажите зависимость кэша как имя кэша, например:

<% cache project do %>
  <b>All the topics on this project</b>
  <%= render project.topics %>
<% end %>

Этот подход предполагает, что при добавлении новой темы вы будете обновлять проект. Ключ кэша, сгенерированный по этому вызову, будет выглядеть примерно так:

views/projects/123-20120806214154/7a1156131a6928cb0026877f8b749ac9
      ^class   ^id ^updated_at    ^template tree digest

Таким образом, кэш автоматически обновляется всякий раз, когда обновляется поле updated_at проекта.

Если ваш кэш шаблона зависит от нескольких источников (старайтесь избегать этого, чтобы упростить процесс), вы можете указать все эти зависимости в виде массива:

<% cache [ project, current_user ] do %>
  <b>All the topics on this project</b>
  <%= render project.topics %>
<% end %>

Это включит обе записи в ключ кэша, и обновление любой из них приведет к истечению срока действия кэша.

Шаблон хэш

Хэш шаблона, который добавляется к ключу кэша, вычисляется путем взятия md5 содержимого всего файла шаблона. Это гарантирует, что ваши кэши автоматически истекут при изменении файла шаблона.

Обратите внимание, что md5 вычисляется для всего файла шаблона, а не только для содержимого внутри вызова do/end кэша. Таким образом, изменение чего-либо за пределами этого вызова может привести к истечению срока действия кэша.

Кроме того, инструмент вычисления хэша автоматически просматривает файл шаблона в поисках явных и неявных зависимостей и включает их в хэш.

Инструмент вычисления хэша можно отключить, передав skip_digest: true в качестве параметра вызову cache:

<% cache project, skip_digest: true do %>
  <b>All the topics on this project</b>
  <%= render project.topics %>
<% end %>

Неявные зависимости

Большинство зависимостей шаблонов могут быть выведены из вызовов render в самом шаблоне. Вот несколько примеров вызовов render, которые инструмент вычисления хэша умеет декодировать:

render partial: "comments/comment", collection: commentable.comments
render "comments/comments"
render 'comments/comments'
render('comments/comments')

render "header" => render("comments/header")

render(@topic)         => render("topics/topic")
render(topics)         => render("topics/topic")
render(message.topics) => render("topics/topic")

Однако не все вызовы render можно вывести таким образом. Вот несколько примеров того, что невозможно вывести:

render group_of_attachments
render @project.documents.where(published: true).order('created_at')

Вам придется переписать их в явной форме:

render partial: 'attachments/attachment', collection: group_of_attachments
render partial: 'documents/document', collection: @project.documents.where(published: true).order('created_at')

Явные зависимости

Иногда у вас есть зависимости шаблонов, которые вообще невозможно вывести. Это обычно происходит, когда отрисовка шаблона выполняется в помощниках. Вот пример:

<%= render_sortable_todolists @project.todolists %>

Вам нужно будет использовать специальный формат комментариев для их вызова:

<%# Template Dependency: todolists/todolist %>
<%= render_sortable_todolists @project.todolists %>

Шаблон, используемый для сопоставления этих зависимостей, — /# Шаблон Зависимость: ([^ ]+)/, поэтому важно набирать его именно так. Вы можете объявить только одну зависимость шаблона в строке.

Внешние зависимости

Если вы используете метод помощника, например, внутри кэшированного блока, и затем обновляете этот помощник, вам также придется обновлять кэш. Не имеет значения, как вы это сделаете, но хэш файла шаблона должен измениться. Одним из советов является явное указание в комментарии, например:

<%# Helper Dependency Updated: May 6, 2012 at 6pm %>
<%= some_helper_method(person) %>

Теперь всё, что вам нужно сделать, это изменить эту метку времени при изменении метода помощника.

cache_fragment_name(name = {}, options = nil) Показать исходный код
# File actionview/lib/action_view/helpers/cache_helper.rb, line 154
def cache_fragment_name(name = {}, options = nil)
  skip_digest = options && options[:skip_digest]

  if skip_digest
    name
  else
    fragment_name_with_digest(name)
  end
end

Этот помощник возвращает имя ключа кэша для заданного вызова кэширования фрагмента. Передавая skip_digest: true в cache, можно вручную отключить вычисление хэша фрагментов кэша. Это полезно, когда фрагменты кэша невозможно вручную обновить, если вам не известен точный ключ, что характерно для использования memcached.

cache_if(condition, name = {}, options = nil) { || ... } Показать исходный код
# File actionview/lib/action_view/helpers/cache_helper.rb, line 129
def cache_if(condition, name = {}, options = nil, &block)
  if condition
    cache(name, options, &block)
  else
    yield
  end

  nil
end

Кэширование фрагментов представления, если condition имеет значение true

<% cache_if admin?, project do %>
  <b>All the topics on this project</b>
  <%= render project.topics %>
<% end %>
cache_unless(condition, name = {}, options = nil, &block) Показать исходный код
# File actionview/lib/action_view/helpers/cache_helper.rb, line 145
def cache_unless(condition, name = {}, options = nil, &block)
  cache_if !condition, name, options, &block
end

Кэширование фрагментов представления, если condition имеет значение false

<% cache_unless admin?, project do %>
  <b>All the topics on this project</b>
  <%= render project.topics %>
<% end %>

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

Spec-Zone.ru

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