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

Chr*_*fer 3 caching ruby-on-rails

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

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

产品#显示视图:

cache('product-' + @product.id.to_s)  do
# View stuff
end
Run Code Online (Sandbox Code Playgroud)

产品#显示控制器:

unless fragment_exist?('product-19834') # ID obviously dynamically loaded
# Perform slow calculations
end
Run Code Online (Sandbox Code Playgroud)

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

views/product-19834/b05c4ed1bdb428f73b2c73203769b40f
Run Code Online (Sandbox Code Playgroud)

因此,当我检查fragment_exist是否正在检查正确的字符串时(因为我正在检查'views/product-19834').我也试过用:

fragment_exist?("product-#{@product.id}/#{@product.cache_key}")
Run Code Online (Sandbox Code Playgroud)

但它使用与实际创建的不同的cache_key进行检查.

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

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

Chr*_*fer 6

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

视图

cache ("product" + @product.id, :skip_digest => true) 
Run Code Online (Sandbox Code Playgroud)

调节器

fragment_exist?("product-#{@product.id}")
Run Code Online (Sandbox Code Playgroud)