модуль ActionView::Helpers::CacheHelper
Общедоступные методы экземпляров
# 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) %>
Теперь всё, что вам нужно сделать, это изменить эту метку времени при изменении метода помощника.
# 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.
# 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 %>
# 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.