Rails:如果存在缓存片段,则跳过控制器(使用cache_key)

时间:2015-08-21 10:32:10

标签: ruby-on-rails caching

我一直在使用缓存,最近发现我的片段缓存并没有阻止我的控制器执行代码,因为它一直都是这样。我把问题归结为与cache_key有关,这似乎是一个新功能?

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

产品#显示视图:

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

产品#显示控制器:

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进行检查。

我宁愿使用这个解决方案而不是控制器缓存或像互锁这样的宝石。

我的问题是: - 如何在控制器中检查考虑此缓存密钥的特定视图是否存在片段?

2 个答案:

答案 0 :(得分:6)

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

查看

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

控制器

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

答案 1 :(得分:0)

值得指出的是,尽管建议的解决方案(fragment_exist?)可以工作,但它更像是黑客。

在您的问题中,您说

  

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

因此,您真正想要的是“控制器缓存” 。但是片段缓存是“视图缓存”

  

片段缓存允许将视图逻辑片段包装在   缓存块,并从缓存存储中送出   (Rails Guides 5.2.3

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

从我的角度来看,哪一种都更适合您的特定用例。