Question

Je veux expirer fragments avec une balayeuse. Les callbacks de balayeuse sont exécutés, mais les appels à expire_fragment ne font rien, parce que (je suppose) cache_configured? rendement nul. Le cache est configuré et fragments sont créés et utilisés dans mes modèles (vérifié dans les journaux). Qu'est-ce que je fais mal?

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

Dans les fichiers journaux, cache_configured? est nul et ainsi est perform_caching et cache_store.

AuctionSweeper.expire_details 12732 nil=nil&&nil

Je suppose que mes fragments ne sont pas périmés parce que le code de expire_fragment lit comme suit:

fichier actionpack / lib / action_controller / cache / fragments .rb, ligne 87

87:       def expire_fragment(key, options = nil)
88:         return unless cache_configured?
Était-ce utile?

La solution

J'ai trouvé une solution (bidouille?) ici qui suggère ensemble @Controller et cela fonctionne pour moi.

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

Aussi une note à moi-même: souvenez-vous de revenir vrai avant de filtres aussi dans balayeuses ou vous obtenez ActiveRecord :: RecordNotSaved et se demander pourquoi

.

Autres conseils

Vous ne partagez pas votre Rails.env - la mise en cache est naturellement désactivé dans development et test - vous avez manqué peut-être quelque chose

Au lieu de définir la variable d'instance pour le contrôleur que j'utilise un initialiseur appelé 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

Alors je hérite de lui pour tout observateur qui est des caches de balayage.

class ModelSweeper < CacheSweepingObserver  
  observe Model

  def after_update(model)
    expire_fragment "#{model.id}"
    true
  end
end
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top