【问题标题】:Rails: Skip controller if cache fragment exist (with cache_key)Rails:如果缓存片段存在则跳过控制器(使用cache_key)
【发布时间】:2019-06-07 21:28:18
【问题描述】:

我已经使用缓存很长时间了,最​​近发现我的片段缓存并没有像往常一样阻止我的控制器执行代码。我已将问题归结为与似乎是新功能的 cache_key 有关?

这是我以前的解决方案,不再按预期工作。

产品#Show-view:

cache('product-' + @product.id.to_s)  do
# View stuff
end

Product#Show-controller:

unless fragment_exist?('product-19834') # ID obviously dynamically loaded
# Perform slow calculations
end

缓存工作正常。它写入和读取片段,但它仍然执行控制器(这是我想使用缓存的全部原因)。这归结为片段具有添加的唯一 id,因此创建的片段类似于:

views/product-19834/b05c4ed1bdb428f73b2c73203769b40f

所以当我检查 fragment_exist 是否存在时,我没有检查正确的字符串(因为我正在检查“views/product-19834”)。我也试过用:

fragment_exist?("product-#{@product.id}/#{@product.cache_key}")

但它检查的 cache_key 与实际创建的不同。

我宁愿使用这种解决方案,也不愿使用控制器缓存或联锁之类的宝石。

我的问题是: - 考虑到这个缓存键,我如何在控制器中检查特定视图的片段是否存在?

【问题讨论】:

  • 你使用过动作缓存吗?
  • 我已经尝试过一段时间,但结果证明不会在其他地方引起问题,我非常需要使用这个解决方案。感觉它不应该开箱即用,对吧?
  • cache_key 附加的视图哈希字符串是视图模板的 MD5 哈希。不幸的是,这将很难从您的控制器访问。我建议重构你的控制器逻辑以避免依赖于现有视图片段缓存的结果的耗时逻辑。例如,您可以通过模型缓存控制器中耗时的方法来解决此问题。如果这不可能,一个快速的解决方法可能是在生成 cache_key 时使用猴子补丁 rails 停止添加 MD5 哈希:stackoverflow.com/a/25839145/3448554
  • 谢谢,Kelseydh。该链接中的解决方案(skip_digest => true)运行良好!如果你愿意,你可以把它作为答案。

标签: ruby-on-rails caching


【解决方案1】:

正如 Kelseydh 在链接中指出的那样,解决方案是在缓存请求中使用 skip_digest => true:

查看

cache ("product" + @product.id, :skip_digest => true) 

控制器

fragment_exist?("product-#{@product.id}")

【讨论】:

    【解决方案2】:

    可能值得指出的是,虽然提议的解决方案 (fragment_exist?) 可以工作,但它更像是一个 hack。

    在你的问题中,你说

    它写入和读取片段,但它仍然执行控制器 (这就是我想使用缓存的全部原因)

    所以你真正想要的是“控制器缓存”。但是片段缓存是“视图缓存”

    片段缓存允许将视图逻辑的片段包装在一个 缓存块并从缓存存储中提供 (Rails Guides 5.2.3)

    对于“控制器缓存”,Rails 已经提供了一些选项:

    在我看来,哪些更适合您的特定用例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-23
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 2016-12-16
      • 1970-01-01
      相关资源
      最近更新 更多