I am using fragment caching in order to speed up the rendering time of Comfortable Mexican Sofa. However, I cannot figure out how to get it to expire the cache for a particular object when I update it.
I am using Comfy as a CMS for a company website that I am building. To allow for dynamic page content I have set it up so it renders directories of pages as blocks of content.
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
I am then rendering the collections using the cms_block_content
helpers given by CMS.
<% @clients.each do | client |%>
<img class="client__logo lazy" data-original="<%=cms_block_content(:client_logo, client).file.url%>">
<%end%>
I also introduced some fragment caching as all the inline rendering was massively slowing down the loading of the page.
However, I have run into a problem. When I create or delete new content it appears/disappears on the page fine, however, when I update content the content on the page doesn't update. Updating content doesn't seem to expire the cached content (if you run Rails.cache.clear
then the updated content loads).
I looked into creating a cache sweeper as posited in the CMS documentation but I wasn't quite sure how to proceed as I am not sure what parameters to pass through to the actual expire_fragment
method.
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
Is this the best way to proceed? If so, what can I pass through to the expire_fragment method?
Many thanks!
Tom