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