我有一个caches_page
用于某些控制器/动作的应用程序。为了使缓存过期,我使用清扫器。总而言之,这是一个标准解决方案。
但是,由于某些更改可能会导致服务器上出现一些请求(因为推送通知已发送出去并可能触发客户端设备获取新数据),所以我希望能够预渲染缓存,所以它在请求到来之前就准备好了。当然,我可以等待第一个请求自动写入缓存,但是在这种情况下,我知道请求会来,可能会有很多,而且它们可能就在附近-同时。所以我想准备好缓存。
为了增加一些复杂性,更新是通过一个普通的网页完成的,并在一个标准的、主要是脚手架的控制器中处理,而我想要缓存的“页面”是一个完全不同的控制器的 JSON 响应,它作为一个 API。
那么,我如何从清扫器(或从处理缓存过期更新的控制器)触发新的页面缓存以立即写入?
另一种说法可能是:如何从一个控制器向另一个控制器发出内部请求?
编辑:最终做了你在下面看到的事情。它不是非常优雅,但它很有效
class ModelSweeper < ActionController::Caching::Sweeper
observe Model
def after_create(model)
expire_pages_for(model)
end
def after_update(model)
expire_pages_for(model)
end
def after_destroy(model)
expire_pages_for(model)
end
protected
def expire_pages_for(model)
# expire index page
expire_and_bake(models_url)
# expire show page
expire_and_bake(model_url(model))
end
def expire_and_bake(url)
# extract the path from the URL
path = url.sub(%r{\Ahttp://[^/]+}, "")
# expire the cache
expire_page(path)
# request the url (writes a new cache)
system "curl '#{url}' &> /dev/null &"
end
end