2011-08-16 4 views
6

Mi controlador tiene esto:carriles 3 de almacenamiento en caché: caducará la acción de ruta denominada

caches_action :render_ticker_for_channel, :expires_in => 30.seconds 

En mis rutas presentar tengo esto:

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

En el archivo de registro que veo esto:

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

¿Cómo expirar esto manualmente? Necesito expirar esto desde un controlador diferente que el controlador de renderizado, pero incluso dentro del controlador de renderizado no puedo lograr que caduque lo correcto.

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

Este:

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

produce:

Expire fragment views/render_c_t/63 (3.5ms) 

¿Cómo puedo conseguir que expire el mismo camino que 'caches_action' está produciendo ?!

+0

No tengo la suficiente confianza para agregar esto como una respuesta completa, pero ¿ha probado la puerta de atrás? 'Rails.application.routes.url_helpers' le dará acceso a sus ayudantes y devolverá una cadena que es la ruta y/o url que se enviaría al navegador en un encabezado de ubicación. Pruebe 'Rails.application.routes.url_helpers.render_ticker_for_channel_path (63)' y 'Rails.application.routes.url_helpers.render_ticker_for_channel (63,: host => 'mcr3.dev ') 'Es posible que pueda pasar la cadena resultante (con alguna manipulación) a' expire_action' y hacer que encuentre el fragmento caché correcto. Feo, pero podría funcionar –

Respuesta

0

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 ser enviado al navegador en un encabezado de ubicación.

Trate Rails.application.routes.url_helpers.render_ticker_for_channel_path(63) que debe 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 alguna manipulación que se ha podido analizar, aparte de que la segunda cadena para llegar de nuevo al nombre que Rails está utilizando 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!

5

utilizar la versión de expresiones regulares de expire_fragment:

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

si tiene caché en ** ** file_store, esta es la mejor manera de cumplir con expresiones regulares – Anatoly

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

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

Cuestiones relacionadas