2

我有以下设置:一个名为类别的模型。这些类别使用​​ ActiveAdmin 进行管理。我想使用页面缓存来缓存类别。

这就是我设置 app/admin/categories.rb 的方式

ActiveAdmin.register Category do
    controller do 
        cache_sweeper :category_sweeper
    end
end

这是我的扫地机:

class CategorySweeper < ActionController::Caching::Sweeper
  observe Category

  def after_save(category)
    expire_cache(category)
  end

  def after_destroy(category)
    expire_cache(category)
  end

  def expire_cache(category)
    expire_page :controller => 'categories', :action => 'index', :format => 'json'
  end
end

这是我的控制器:

class CategoriesController < ApplicationController
    caches_page :index
  cache_sweeper :category_sweeper

    respond_to :json

    def index
      @categories = Category.all 
      respond_with(@categories)
    end

    def show
      CategorySweeper.instance.expire_cache(@category)
      respond_with('manually sweeped!')
    end
end

所以这个想法是当活动管理员发生变化时,应该调用清扫器。我设置了 debug.log 并证明它正在工作。但由于某种原因,缓存不会过期!

但是,如果我执行显示操作(即转到 /categories/1.json,那么我的手动清扫器就会启动并且它工作正常)。那么为什么清扫器只在我调用它时才起作用,而不是在管理员发生变化时起作用呢?

在此先感谢,-大卫

4

1 回答 1

2

您的ActiveAdmin控制器位于不同的命名空间中,请参阅SO 问题。

不久:

在缓存过期 url 代码中添加斜杠:

def expire_cache(category)
  expire_page :controller => '/categories', :action => 'index', :format => 'json'
end
于 2012-05-05T21:25:57.420 回答