2

失去了如何根据模型间接为控制器正确使用动作缓存的想法。

背景场景:

为产品对象提供一个简单的导轨模型

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
  1. 我不能简单地发送 GET 请求来获取未缓存的提要,因为 HTTP 服务器抛出超时错误,该错误被硬编码为 30 秒
  2. 我正在监视产品模型更改,因此没有必要为未连接到产品的 FeedsController 创建回调,只需使用其实例

任何建议如何监控独立模型中的更改并为其他独立控制器操作更新缓存?

4

0 回答 0