У меня есть приложение, которое использует caches_page
для определенных контроллеров / действий.Для истечения срока действия кеша я использую подметальную машину.В общем, это стандартное решение.
Тем не менее, поскольку некоторые изменения могут привести к небольшому потоку запросов на сервере (потому что push-уведомления отправляются и могут запускать клиентские устройства для получения новых данных),Я хотел бы иметь возможность предварительно визуализировать кэш, чтобы он был готов до того, как запросы будут добавлены. Конечно, я мог бы просто подождать, пока первый запрос автоматически запишет кэш, но в этом случае я знаю что запросы придут, что их может быть много, и что они могут быть почти одновременными.Поэтому я хотел бы, чтобы кэш был готов.
Чтобы добавить некоторую сложность, обновления выполняются через обычную веб-страницу и обрабатываются в стандартном, в основном скаффолдинговом контроллере, тогда как «страницу» я хочу кешировать.является ответом 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