Рельсы 3: Подметалка не разрушает фрагменты, считает, что кэширование было отключено

StackOverflow https://stackoverflow.com/questions/4598293

Вопрос

Я хочу истекать фрагменты с подметальной машиной. Обратные вызовы выполняются, но призывы к истечению_фрагмента ничего не делают, потому что (я полагаю) 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]

Производство.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? это NIL, и это так же, как и exect_caching и cache_store.

AuctionSweeper.expire_details 12732 nil=nil&&nil

Поэтому я предполагаю, что мои фрагменты не истек, потому что код истечения срока действия_фрагмента гласит:

File actionpack/lib/action_controller/caching/fragments.rb, строка 87

87:       def expire_fragment(key, options = nil)
88:         return unless cache_configured?
Это было полезно?

Решение

Я нашел решение (взломать?) здесь Это предлагает установить @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

Также примечание для себя: не забудьте вернуть истину из фильтров, также в подметальных машинах, или вы получаете Activerecord :: recordnotsaved и удивляйтесь, почему.

Другие советы

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

Вместо установки переменной экземпляра для контроллера я использую инициализатор с именем 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top