如何在 Comfortable Mexican Sofa 更新时使片段缓存过期?
How do I expire fragment caching on update in Comfortable Mexican Sofa?
我正在使用片段缓存来加快 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 提供的 cms_block_content
助手渲染集合。
<% @clients.each do | client |%>
<img class="client__logo lazy" data-original="<%=cms_block_content(:client_logo, client).file.url%>">
<%end%>
我还引入了一些片段缓存,因为所有内联渲染都大大减慢了页面加载速度。
但是,我运行遇到了问题。当我创建或删除新内容时,页面上的 appears/disappears 正常,但是,当我更新内容时,页面上的内容不会更新。更新内容似乎不会使缓存的内容过期(如果您 运行 Rails.cache.clear
然后加载更新的内容)。
我研究过创建缓存清扫器 as posited in the CMS documentation 但我不太确定如何继续,因为我不确定要将哪些参数传递给实际的 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 方法?
非常感谢!
汤姆
事实上,正确答案一直都在盯着我看,我只是没有完全意识到。我需要做的就是传递记录。
expire_fragment(record)
然而,当我第一次尝试时它不起作用的原因是 a digest is added to the cache when it is saved。这意味着您不能手动使它们过期。因此,当您缓存视图时,您需要确保跳过摘要。
<% @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%>
瞧瞧!有用。
我正在使用片段缓存来加快 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 提供的 cms_block_content
助手渲染集合。
<% @clients.each do | client |%>
<img class="client__logo lazy" data-original="<%=cms_block_content(:client_logo, client).file.url%>">
<%end%>
我还引入了一些片段缓存,因为所有内联渲染都大大减慢了页面加载速度。
但是,我运行遇到了问题。当我创建或删除新内容时,页面上的 appears/disappears 正常,但是,当我更新内容时,页面上的内容不会更新。更新内容似乎不会使缓存的内容过期(如果您 运行 Rails.cache.clear
然后加载更新的内容)。
我研究过创建缓存清扫器 as posited in the CMS documentation 但我不太确定如何继续,因为我不确定要将哪些参数传递给实际的 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 方法?
非常感谢!
汤姆
事实上,正确答案一直都在盯着我看,我只是没有完全意识到。我需要做的就是传递记录。
expire_fragment(record)
然而,当我第一次尝试时它不起作用的原因是 a digest is added to the cache when it is saved。这意味着您不能手动使它们过期。因此,当您缓存视图时,您需要确保跳过摘要。
<% @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%>
瞧瞧!有用。