Ruby on rails 使用链轮检测过期资产?

Ruby on rails 使用链轮检测过期资产?,ruby-on-rails,caching,asset-pipeline,sprockets,Ruby On Rails,Caching,Asset Pipeline,Sprockets,在链轮中,如何检测资产是否过期 我尝试了以下方法,结果出乎意料: e = Rails.application.assets # sprockets env x = Rails.application.assets.index e['path/to/my/asset'].body #=> prints asset e['path/to/my/asset'].fresh?(x) #=> true # modify the asset file (to change mtime a

在链轮中,如何检测资产是否过期

我尝试了以下方法,结果出乎意料:

e = Rails.application.assets # sprockets env
x = Rails.application.assets.index

e['path/to/my/asset'].body
#=> prints asset

e['path/to/my/asset'].fresh?(x)
#=> true


# modify the asset file (to change mtime and digest)


e['path/to/my/asset'].fresh?(x)
#=> true

#!? Why wasn't that false?
缓存机制让我感到困惑。此外,在检查资产时,它告诉我
mtime
是原始值,而不是我修改上述文件的时间。有人能解释一下这里发生了什么,以及我如何能检测到过期资产吗?我希望在我的gem中利用sprockets依赖/缓存系统

我的目标:


我正在创建一个gem,它可以在管道中找到资产并从中生成一些内容。这个gem与ActionView集成,后者通过自己的缓存使事情复杂化。如果链轮中的资产过时并且将在下一次获取时重新加载,我需要一些方法来破坏ActionView的缓存。与其在我的gem中镜像sprocket的缓存系统,我希望只询问sprockets的资产状况——这似乎完全可能,只要我能弄清楚发生了什么。

我无法回答如何绕过这一问题,但我可以(有信心地)告诉你它为什么会这样。链轮不仅使用
mtime
来确定过时性,还使用文件本身的摘要。首先,如果
mtime
最近没有更新,它将以新的形式返回资产;其次,如果哈希摘要没有更改(对于相关方法,请参见)。因为<代码>触碰<代码>不会改变文件的散列,链轮会认为它是新鲜的。 我不太清楚你们的目标是什么,所以我不能给出太多建议。所使用的依赖项跟踪大部分是私有的,但是可以绕过它来强制重置。如果你要寻找的是一个快速的方法,为了在开发一个GEM时为了本地测试而使一个资产过时,你可以考虑为<代码>资产或<代码> PraseStaseStase<代码>创建一个猴子补丁,它可以刷新旧的代码> Mtime< /Calp>和<代码>摘要>代码>值。
编辑-我做了更多的挖掘,我想我发现了一些有用的东西。
assets
上的
index
方法在每次调用时都会创建一个新对象,实际上是当时资产的快照,而当您向环境请求资产时,环境会不断刷新—查找资产会使它在资产过时时自动刷新该资产


理论上,这应该有一个非常简单的解决方案——只需将您对
x['path/to/asset']的新调用倒置即可。fresh?(e)

气泡,谢谢您的回答。我编辑了这个问题,以反映出我实际上修改了这个文件(不仅仅是碰了它),因为我知道这个摘要哈希。我会更新这个问题来讨论更多关于我的目标。我想我原来的答案有点太深奥了。当您像现在这样查找资产时,实际上是在创建一个新的资产,
[]
查找
Sprockets::Environment
会创建一个新的资产,新创建的资产自然不会不新鲜。如果你能保持引用的有效性,这将是可行的,但在任何情况下可能都不方便。我会再挖一点,然后再打给你。