我一直在使用缓存,最近发现我的片段缓存并没有阻止我的控制器执行代码,因为它一直都是这样。我把问题归结为与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进行检查。
我宁愿使用这个解决方案而不是控制器缓存或像互锁这样的宝石。
我的问题是: - 如何在控制器中检查考虑此缓存密钥的特定视图是否存在片段?
答案 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已经提供了一些选项:
从我的角度来看,哪一种都更适合您的特定用例。