Rails 3: frammenti spazzatrice non distruttivo, pensa la cache è stata disabilitata
-
15-10-2019 - |
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?
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