Rails 3: Sweeper не уничтожает фрагменты, думает, что кэширование отключено - PullRequest
1 голос
/ 04 января 2011

Я хочу, чтобы фрагменты с истекшим сроком действия. Обратные вызовы уборщика выполняются, но вызовы expire_fragment ничего не делают, потому что (я предполагаю) cache_configured? возвращает ноль Кэширование настроено, фрагменты создаются и используются в моих шаблонах (проверено в логах). Что я делаю не так?

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

В файлах журналов cache_configured? равно нулю, равно как и execute_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?

Ответы [ 3 ]

5 голосов
/ 05 января 2011

Я нашел решение (хак?) здесь , которое предлагает установить @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 до того, как фильтры также будут в уборщиках, или вы получите ActiveRecord :: RecordNotSaved и удивитесь, почему.

0 голосов
/ 09 марта 2011

Вместо того, чтобы устанавливать переменную экземпляра для контроллера, я использую инициализатор 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
0 голосов
/ 05 января 2011

Вы не поделились своим Rails.env - кеширование естественно отключено в development и test - может быть, вы что-то пропустили?

...