1

Ich möchte Fragmente mit einem Kehrmaschine ablaufen. Die Sweeper-Callbacks werden ausgeführt, aber die Aufrufe von expire_fragment tun nichts, weil (ich nehme an) cache_configured? gibt null zurück. Caching ist konfiguriert und Fragmente werden erstellt und in meinen Vorlagen verwendet (in den Protokollen verifiziert). Was mache ich falsch?Rails 3: Sweeper zerstört keine Fragmente, denkt Caching wurde deaktiviert

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 

In Protokolldateien, cache_configured? ist null und so ist perform_caching und cache_store.

AuctionSweeper.expire_details 12732 nil=nil&&nil 

Also gehe ich davon aus, dass meine Fragmente abgelaufen sind nicht, da der Code von expire_fragment lautet:

File actionpack/lib/action_controller/caching/fragments.rb, line 87

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

Antwort

5

Ich fand eine Lösung (hack?) here, die vorschlägt, @controller zu setzen, und es funktioniert für mich.

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 

Auch eine Notiz an mich selbst: Speichern von vor Filter auch in Kehrmaschinen true zurück, oder Sie bekommen Active :: RecordNotSaved und sich fragen, warum.

+2

Danke! Der Hack mit dem @controller hat für mich funktioniert. Es ist seltsam, dass dies in der offiziellen Dokumentation nicht erwähnt wird. –

+0

Danke, dass Sie diese Lösung teilen! :-) – Arkan

0

Sie nicht teilen Sie Ihre Rails.env - Caching ist natürlich deaktiviert in development und test - vielleicht hast du etwas verpasst?

+0

Es ist in der Produktion env. – Jan

0

Statt die Instanzvariable für die Steuerung der Einstellung I einen Initialisierer 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 

dann davon I für jeden Beobachter erben genannt verwenden, die für Kehr Caches ist.

class ModelSweeper < CacheSweepingObserver 
    observe Model 

    def after_update(model) 
    expire_fragment "#{model.id}" 
    true 
    end 
end