caché de Rails 3: acción de expiración para ruta nombrada

Mi controlador tiene esto:

caches_action :render_ticker_for_channel, :expires_in => 30.seconds 

En mi archivo de rutas tengo esto:

 match '/render_c_t/:channel_id' => 'render#render_ticker_for_channel', :as => :render_channel_ticker 

En el archivo de registro veo esto:

 Write fragment views/mcr3.dev/render_c_t/63 (11.6ms) 

¿Cómo caduca esto manualmente? Necesito vencer esto desde un controlador diferente al controlador de render, pero incluso dentro del controlador de render no puedo hacer que caduque lo correcto.

Si lo hago:

  expire_action(:controller => 'render', :action => 'render_ticker_for_channel', :id => c.id) 

Veo:

 Expire fragment views/mcr3.dev/render/render_ticker_for_channel/63 (3.2ms) 

Si lo hago:

 expire_action(:controller => 'render', :action => 'render_c_t', :id => c.id) 

Veo:

 Expire fragment views/mcr3.dev/render/render_c_t/63 (3.2ms) 

Esta:

 expire_action("render_c_t/#{c.id}") 

produce:

 Expire fragment views/render_c_t/63 (3.5ms) 

¿Cómo puedo hacer que caduque la misma ruta que produce ‘caches_action’?

Utilice la versión regex de expire_fragment :

 expire_fragment %r{render_c_t/#{c.id}/} 

Definitivamente debería haber más “Rails Way” para hacer esto, pero esto podría funcionar como una puerta trasera: Rails.application.routes.url_helpers le dará acceso a sus ayudantes y cada uno devolverá una cadena que es la ruta y / o url que se enviaría al navegador en un encabezado de ubicación.

Intente Rails.application.routes.url_helpers.render_ticker_for_channel_path(63) que debería devolver /render_c_t/63 y Rails.application.routes.url_helpers.render_ticker_for_channel(63, :host => 'mcr3.dev') que debe devolver http://mcr3.dev/render_c_t/63

Con un poco de manipulación, podría analizar esa segunda cadena para volver al nombre que Rails está usando para la acción en caché:

 def funky_action_cache_name(route, params) Rails.application.routes.url_helpers.send(route.to_s+'_url', params).gsub(/https?:\/\//,'') end # expire_action(funky_action_cache_name(:render_ticker_for_channel, :id => 63)) 

No es la solución más hermosa, pero debería funcionar!

 caches_action :render_ticker_for_channel, :if => proc do !!params['doCache'] end 

Pero para que esta solución funcione, necesitamos pasar un parámetro adicional a través de la cadena de consulta o el cuerpo de la publicación.