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?

Foi útil?

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')

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top