caches_page
特定のコントローラー/アクションを使用するアプリケーションがあります。キャッシュを期限切れにするために、スイーパーを使用します。全体として、これは標準的なソリューションです。
ただし、一部の変更により、サーバーで要求が殺到する可能性があるため (プッシュ通知が送信され、クライアント デバイスが新しいデータをフェッチするようになる可能性があるため)、キャッシュを事前にレンダリングできるようにしたいと考えています。もちろん、最初のリクエストが自動的にキャッシュに書き込まれるのを待つこともできますが、この場合、リクエストが来ること、多くのリクエストがある可能性、およびそれらが近くにある可能性があることを知っています-同時に。というわけで、キャッシュを用意したいと思います。
複雑さを増すために、更新は通常の Web ページを介して行われ、ほとんどがスキャフォールディングされた標準のコントローラーで処理されますが、キャッシュしたい「ページ」は、API として機能するまったく異なるコントローラーの JSON 応答です。
では、スイーパー (またはキャッシュ期限切れの更新を処理するコントローラー) から新しいページ キャッシュをトリガーして、すぐに書き込むにはどうすればよいでしょうか?
別の言い方をすると、あるコントローラーから別のコントローラーへの内部要求を行うにはどうすればよいですか?
編集:以下に示すようなことをしてしまいました。それほどエレガントではありませんが、効果的です
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