Как обновить кэшированное действие?
Потеря идей о том, как правильно использовать кэширование действий для контроллера косвенно в зависимости от модели.
Фоновый сценарий:
Наличие простой модели рельсов для объектов продукта
class Product < ActiveRecord::Base
...
end
Контроллер, который обрабатывает запросы на каналы и использует экземпляры Product для отображения представлений.
class FeedsController < ActionController::Base
# caches index action of a controller, generates large response
cache_action :index
def index
@products = Product.all
respond_to do |format|
format.xml
end
end
# need to clear cached `index' and fill cache again
# PUT request is routed to `update'
def update
expire_action :action => :index, :format => :xml
# ?? how call `index' again to update cache ??
render nothing: true
end
end
Теперь мне нужно отслеживать изменения в модели продукта, и, если обнаружены какие-либо изменения, убедитесь, что кэшированное действие из FeedsController будет признано недействительным и заполнено обновленными данными. Надеюсь, я не спрашиваю ничего экзотического.
Пока что я закончил со следующим наблюдателем:
class FeedSweeper < ActionController::Caching::Sweeper
observe Product
def after_update(product)
# Not found other way than directly remove cached view
# for FeedsController
# No `@control' instance available here
Rails.cache.delete_matched /feeds\/.+\.xml$/
# How to invoke FeedsController#index from here ??
# To fill updated data in cache
end
end
- Я не могу просто отправить GET-запрос для получения некэшированного канала, потому что HTTP-сервер выдает ошибку тайм-аута, которая жестко задана до 30 секунд
- Я отслеживаю изменения модели продукта, поэтому нет смысла создавать обратный вызов для FeedsController, который не подключен к продукту, просто используйте его экземпляры
Любой совет, как отслеживать изменения в независимой модели и обновлять кэш для других независимых действий контроллера?