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

Ответы на вопрос(1)

Ваш ответ на вопрос