1

我想用扫地机使碎片过期。执行清扫器回调,但对 expire_fragment 的调用什么也不做,因为(我假设)cache_configured?返回零。缓存已配置,并且正在我的模板中创建和使用片段(在日志中进行了验证)。我究竟做错了什么?

应用程序.rb

config.cache_store = :mem_cache_store, "XXX.XXX.XXX.XXX", { # I use a real IP
    :compress => true,
    :namespace => "#{Rails.env}_r3"
  }
config.active_record.observers = [:auction_sweeper, :address_sweeper]

生产.rb

config.action_controller.perform_caching = true

拍卖清扫器.rb

class AuctionSweeper < ActionController::Caching::Sweeper 
  observe Auction

  def after_create(auction)
    Rails.logger.info "AuctionSweeper.expire_details #{auction.id} #{cache_configured?.inspect}=#{perform_caching.inspect}&&#{cache_store.inspect}"
    expire_fragment("auction/#{auction.reference_sid}")
  end
end

在日志文件中,cache_configured?为 nil,perform_caching 和 cache_store 也是如此。

AuctionSweeper.expire_details 12732 nil=nil&&nil

所以我假设我的片段没有过期,因为 expire_fragment 的代码如下:

文件 actionpack/lib/action_controller/caching/fragments.rb,第 87 行

87:       def expire_fragment(key, options = nil)
88:         return unless cache_configured?
4

3 回答 3

5

我在这里找到了一个建议设置@controller 的解决方案(hack?),它对我有用。

class AuctionSweeper < ActionController::Caching::Sweeper 
  observe Auction

  def after_create(auction)
    @controller ||= ActionController::Base.new
    Rails.logger.info "AuctionSweeper.expire_details #{auction.id} #{cache_configured?.inspect}=#{perform_caching.inspect}&&#{cache_store.inspect}"
    expire_fragment("auction/#{auction.reference_sid}")
  end
end

还要给我自己一个提示:记得在清扫器中也从过滤器之前返回 true,否则你会得到 ActiveRecord::RecordNotSaved 并想知道为什么。

于 2011-01-04T21:27:44.223 回答
0

你没有分享你的Rails.env- 缓存自然被禁用development并且test- 也许你错过了什么?

于 2011-01-04T21:04:16.917 回答
0

我没有为控制器设置实例变量,而是使用了一个名为 cache_sweeping_observer.rb 的初始化程序

class CacheSweepingObserver < ActiveRecord::Observer
  include ActiveSupport::Configurable
  include ActionController::Caching

  config_accessor :perform_caching

  class << self
    def config
      ActionController::Base.config
    end
  end
end

然后我为任何用于扫描缓存的观察者继承它。

class ModelSweeper < CacheSweepingObserver  
  observe Model

  def after_update(model)
    expire_fragment "#{model.id}"
    true
  end
end
于 2011-03-09T09:52:58.080 回答