Как отключить кеширование фрагментов при обновлении в Comfortable Mexican Sofa?

Я использую кэширование фрагментов, чтобы ускорить время рендеринга удобного мексиканского дивана. Однако я не могу понять, как заставить его истечь кеш для определенного объекта при его обновлении.

Я использую Comfy в качестве CMS для веб-сайта компании, который я создаю. Чтобы разрешить динамическое содержимое страницы, я настроил его таким образом, чтобы каталоги страниц отображались как блоки контента.

class WelcomeController < ApplicationController
  def index
    @testimonials = Comfy::Cms::Page.find_by_full_path!("/testimonials").children
    @clients = Comfy::Cms::Page.find_by_full_path!("/clients").children
    @recent_blogs = Comfy::Cms::Page.find_by_full_path!("/blog").children.published.last(4)
    @team = Comfy::Cms::Page.find_by_full_path!("/team").children
  end

end

Затем я визуализирую коллекции с помощью cms_block_content помощников, предоставленных CMS.

<% @clients.each do | client |%>
    <img class="client__logo lazy" data-original="<%=cms_block_content(:client_logo, client).file.url%>">
<%end%>

Я также ввел некоторое кэширование фрагментов, поскольку весь встроенный рендеринг сильно замедлял загрузку страницы.

Однако я столкнулся с проблемой. Когда я создаю или удаляю новый контент, он появляется/исчезает на странице в порядке, однако, когда я обновляю контент, контент на странице не обновляется. Обновление содержимого, похоже, не истечет срок действия кэшированного содержимого (если вы запустите Rails.cache.clear, то загружается обновленное содержимое).

Я рассмотрел возможность создания очистки кеша как указано в документации CMS, но я не совсем понял, как поступить, так как не знаю, какие параметры передавать фактическому методу expire_fragment.

class CmsAdminSweeper < ActionController::Caching::Sweeper
  observe Comfy::Cms::Page

  def after_update(record)
    do_sweeping(record)
  end

  def do_sweeping(record)
    # return unless modification is made from controller action
    return false if session.blank? || assigns(:site).blank?

    Rails.logger.info("CmsAdminSweeper.do_sweeping in progress...")

    expire_fragment({ controller: '/welcome', action: 'index', id: record.id})
  end
end

Это лучший способ продолжить? Если да, то что я могу передать методу expire_fragment?

Большое спасибо!

Том


person thrgamon    schedule 27.01.2017    source источник
comment
Это сложный способ сделать это. Я не знаю эту cms, но было бы проще создать несколько ключей кеша в представлении и сохранить их в Redis. Затем, когда вы измените ключ объекта, он будет обновлен, и следующий запрос увидит, что ключи кеша не совпадают, и представление будет перезагружено с новыми данными.   -  person Sean Magyar    schedule 27.01.2017
comment
Привет, @SzilardMagyar, спасибо за помощь. Я не совсем уверен, что вы имеете в виду, не могли бы вы указать мне направление на вопрос SO, некоторую документацию или учебник, демонстрирующий, как это сделать, или что-то подобное?   -  person thrgamon    schedule 29.01.2017
comment
Здесь, в части фрагмент/кукла-кеширование: guides.rubyonrails.org/caching_with_rails.html   -  person Sean Magyar    schedule 31.01.2017
comment
Спасибо за ссылку! Теперь я попытался внедрить кэширование на основе ключей, но для этого мне пришлось пропатчить модель драгоценного камня, а затем это открыло совершенно новый мешок червей, поэтому мне пришлось пойти со очистителем, просто используя Rails.cache.clear вместо очистки просто фрагмент в качестве обходного пути.   -  person thrgamon    schedule 02.02.2017


Ответы (1)


Правильный ответ на самом деле все время смотрел мне в лицо, просто я не совсем осознавал это. Все, что мне нужно было сделать, это пройти в записи.

expire_fragment(record)

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

<% @clients.each do | client |%>
     <% cache client, skip_digest: true do %>
          <img class="client__logo lazy" data-original="<%=cms_block_content(:client_logo, client).file.url%>">
     <%end%>
 <%end%>

И вуаля! Оно работает.

person thrgamon    schedule 06.02.2017