1

スイーパーでフラグメントを期限切れにしたい。スイーパー コールバックは実行されますが、expire_fragment への呼び出しは何もしません。nil を返します。キャッシングが構成され、フラグメントが作成され、テンプレートで使用されています (ログで確認しました)。私は何を間違っていますか?

アプリケーション.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]

production.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を設定することを提案する解決策(ハック?)を見つけましたが、それは私にとってはうまくいきます。

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 を返すことを忘れないでください。

于 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 に答える