【问题标题】:How do I expire fragment caching on update in Comfortable Mexican Sofa?如何在舒适的墨西哥沙发上更新片段缓存?
【发布时间】:2023-03-26 01:01:01
【问题描述】:

我正在使用片段缓存来加快 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%>

我还引入了一些片段缓存,因为所有内联渲染都大大减慢了页面的加载速度。

但是,我遇到了一个问题。当我创建或删除新内容时,它会很好地出现/消失在页面上,但是,当我更新内容时,页面上的内容不会更新。更新内容似乎不会使缓存的内容过期(如果您运行 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 方法?

非常感谢!

汤姆

【问题讨论】:

  • 这是很难做到的。我不知道这个cms,但是在视图中创建一些缓存键并将它们保存在redis中会更容易。然后,当您更改对象键时,将更新对象键,并且下一个请求将看到缓存键不匹配,并且视图将重新加载新数据。
  • 嘿@SzilardMagyar,感谢您的帮助。我不太清楚你的意思,你能指出我的方向,无论是 SO 问题,一些文档或教程演示如何做到这一点或类似的东西?
  • 这里在片段/俄罗斯娃娃缓存部分:guides.rubyonrails.org/caching_with_rails.html
  • 感谢您的链接!我现在已经尝试实现基于密钥的缓存,但为了做到这一点,我不得不对 gem 的模型进行修补,然后打开了一个全新的蠕虫包,所以我不得不使用扫地机,只使用 Rails.cache.clear 代替只清除片段作为解决方法。

标签: ruby-on-rails caching comfortable-mexican-sofa


【解决方案1】:

事实上,正确的答案一直在盯着我看,我只是没有意识到。我需要做的就是通过记录。

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%>

瞧!有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多