Rails 3.2: pré-renderiza (assa) um novo cache de página imediatamente após o venciment
Tenho um aplicativo que usacaches_page
para determinados controladores / ações. Para expirar o cache, eu uso uma vassoura. Em suma, é uma solução padrão.
No entanto, como algumas alterações podem causar um pouco de solicitações no servidor (porque as notificações push são enviadas e podem acionar os dispositivos clientes para buscar novos dados), eu gostaria de poder pré-renderizar o cache, então está pronto antes que as solicitações cheguem. Eu poderia esperar pela primeira solicitação para gravar automaticamente o cache, é claro, mas nesse caso, euconhece que os pedidos chegarão, que poderão existir muitos e que eles poderão ser quase simultâneos. Então, eu gostaria de ter o cache pronto.
Para adicionar um pouco de complexidade, as atualizações são feitas através de uma página da Web normal e manipuladas em um controlador padrão, geralmente com andaimes, enquanto a "página" que eu quero armazenar em cache é a resposta JSON para um controlador totalmente diferente que serve como API.
ntão, como eu, de uma vassoura (ou do controlador que está lidando com a atualização que expira no cache) aciono um novo cache de página para ser gravado imediatament
Outra maneira de colocar isso pode ser: Como faço uma solicitação interna de um controlador para outr
Edit: Acabou fazendo algo parecido com o que você vê abaixo. Não é muito elegante, mas é eficaz
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