Domanda

voglio scadere frammenti con una spazzatrice. I callback spazzatrice vengono eseguiti, ma le chiamate a expire_fragment non fanno nulla, perché (presumo) cache_configured? restituisce nulla. Caching è configurato e frammenti vengono creati e utilizzati nei miei modelli (verificato che nei log). Che cosa sto facendo di sbagliato?

application.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

auction_sweeper.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

Nel file di registro, cache_configured? è pari a zero e così è perform_caching e cache_store.

AuctionSweeper.expire_details 12732 nil=nil&&nil

Quindi presumo, che i miei frammenti non sono scaduti perché il codice di expire_fragment legge:

File actionpack / lib / action_controller / caching / frammenti .RB, linea 87

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

Soluzione

Ho trovato una soluzione (mod?) qui che suggerisce di set @controller e funziona per me.

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

Anche una nota a me stesso: ricordarsi di restituire true da prima filtri anche in spazzatrici o si ottiene ActiveRecord :: RecordNotSaved e si chiedono perché

.

Altri suggerimenti

non ha condiviso la tua Rails.env - caching è naturalmente disattivata in development e test -? Forse ti sei perso qualcosa

Invece di impostare la variabile di istanza per il controllore uso un inizializzatore chiamato 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

Poi ho ereditato da esso per qualsiasi osservatore che è per spazzare le cache.

class ModelSweeper < CacheSweepingObserver  
  observe Model

  def after_update(model)
    expire_fragment "#{model.id}"
    true
  end
end
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top