为什么此代码块在Rails.cache.fetch之后执行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么此代码块在Rails.cache.fetch之后执行相关的知识,希望对你有一定的参考价值。
我有这行代码,它完全按照我的要求执行。但我不知道它为什么会起作用。
Rails.cache.fetch(key, expires_in: 1.day) do
a << b
end
它应该做的是如果Rails缓存中不存在密钥,则将b添加到a。
为什么我很困惑?
Rails.cache.fetch(key, expires_in: 1.day)
无论密钥是否已经在缓存中,都返回nil。
问题:为什么代码块在缓存中没有密钥时运行,否则不运行?
额外的细节:Rails缓存连接到Redis。
答案
尽管do ... end
返回Rails.cache.fetch
,但nil
块被评估可能会令人困惑。但do ... end
区块并没有在nil
响应之上运行。
事实上,do ... end
块是fetch
方法调用的另一个参数。看看source code of fetch
。
没有一个块fetch
基本上只做一件事 - 在第328行调用read(name, options)
但是有一个块更多(第307到324行)
以上是关于为什么此代码块在Rails.cache.fetch之后执行的主要内容,如果未能解决你的问题,请参考以下文章
由于缓存目录将所有权更改为 root,Rails 6 应用程序失败