O cache de ação não está expirando corretamente, mesmo quando posso ver que está sendo chamado
-
20-09-2019 - |
Pergunta
Eu tenho uma varredora que deveria expirar alguns caches de ação. Mesmo que o depurador pare imediatamente antes da chamada para Expire_Action, ele não está realmente expirando a ação. Alguma idéia do que poderia estar acontecendo?
Aqui estão os varredores e controladores relevantes.
#Company_sweeper.rb (no diretório 'modelos')
class CompanySweeper < ActionController::Caching::Sweeper
observe Company
def after_save(company)
expire_cache(company) if company.final_save && company.valid?
end
def expire_cache(company)
debugger <= #debugger stops here!
right before the call
I'm trying to make.
expire_action :controller => 'reports',
:action => 'full_report'
end
end
#Reports_controller.rb
class ReportsController < ApplicationController
layout false
caches_action :full_report, :supplier_list, :service_categories
cache_sweeper :company_sweeper
def full_report
#do stuff...
end
end
A maneira como sei que não está expirando é que o relatório completo retorna dados antigos e responde quase instantaneamente. Estranho, certo?
Solução
Você tem um cache_sweeper
Declaração em suas empresas também? O varredor deve ser incluído no controlador que executa ações do ciclo de vida no modelo em questão. A menos que você faça coisas com as instâncias da empresa no relatório cache_sweeper
A linha não pertence a lá.
O cache de ação inclui um nome implícito no host. Se os dois acertos estiverem entrando em diferentes nomes de host, o cache é feito sob um e a expiração sob um diferente.
Outras dicas
Eu não acho que há detalhes suficientes aqui para realmente responder à sua pergunta, mas aqui estão algumas perguntas:
A varredora deve disparar independentemente da ação Full_Report; portanto, se você fizer uma alteração em uma empresa, verá o incêndio do depurador (o que parece estar acontecendo corretamente). Você não precisa executar a ação Full_Report; portanto, neste momento, você pode verificar se o arquivo em cache foi removido. Pode ser útil passar pelo Expire_action no depurador para ver se os Rails estão pulando o vencimento por algum outro motivo.
EDIT: Oh, você sabe o que, eu estava apenas cavando isso, e parece que o Expire_Action deve ser executado no contexto de um controlador (eu estava lendo a fonte do GEM no ActionPack). Ele assume que 'eu' é um controlador; portanto, sua aprovação na opção: o controlador está sendo ignorado.
Outros exemplos fornecem uma string específica em vez de opções (por exemplo, expire_action '/reports/full_report'
) Eu não gosto disso pessoalmente-não está usando o roteador-mas parece que funcionaria.
Talvez você deva mudar para esse método, garantir que ele funcione e, em seguida, no depurador, veja se você tem acesso ao url_for. pode ser tão simples quanto expire_action url_for(:controller => 'reports', :action => 'full_report')