Acción almacenamiento en caché no está expirando correctamente, incluso cuando puedo ver que está siendo llamado

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

Pregunta

Tengo una barredora que se supone que expiran unos cachés de acción. A pesar de que el depurador se detiene inmediatamente antes de la llamada a expire_action, no es en realidad que expira la acción. ¿Alguna idea de lo que podría estar sucediendo?

Éstos son la barredora y el controlador correspondiente.

# company_sweeper.rb (en el directorio '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

La forma en que sé que no expira es que el informe completo devuelve datos antiguos, y responde de manera casi instantánea. Raro, ¿verdad?

¿Fue útil?

Solución

¿Tiene una declaración cache_sweeper en su CompaniesController, también? La barredora se debe incluir en el controlador que realiza acciones de ciclo de vida en el modelo en cuestión. A menos que hacer cosas con las instancias de la compañía en ReportsController, la línea cache_sweeper no pertenece allí.

Acción almacenamiento en caché incluye un nombre de host implícita. Si los dos accesos están llegando en diferentes nombres de host, el almacenamiento en caché se realiza bajo un mismo y expiración bajo una diferente.

Otros consejos

No creo que hay suficientes datos aquí para responder realmente a su pregunta, pero aquí hay algunas preguntas:

La barredora disparará independientemente de la acción full_report, por lo que si se hace un cambio a una empresa, usted debe ver el fuego depurador (que parece que está sucediendo correctamente). Usted entonces no necesita ejecutar la acción full_report, por lo que en este punto se podía comprobar el archivo almacenado en caché se ha eliminado. Podría ser útil para pasar por expire_action en el depurador para ver si los carriles se está saltando la expiración por alguna otra razón.


EDIT: oh sabes qué, yo estaba diggging en esto, y parece que se espera expire_action a ejecutar en el contexto de un controlador (que estaba leyendo la fuente joya en actionpack). Asume 'yo' es un controlador, por lo que su fallecimiento en la opción:. Está siendo ignorada controlador

Otros ejemplos dan una cadena específica en lugar de opciones (por ejemplo expire_action '/reports/full_report') No me gusta que personalmente --- no está utilizando el router --- pero parece que funcionaría.

Tal vez debería cambiar a ese método, asegurarse de que funciona, y luego en el depurador ver si tiene acceso a url_for. que podría ser tan simple como expire_action url_for(:controller => 'reports', :action => 'full_report')

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top