Rails 3.2: предварительный рендеринг (запекание) нового кэша страниц сразу после истечения срока его действия?
У меня есть приложение, которое использует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