2011-07-26 10 views
6

¿Hay alguna manera de precompilar un caché de página sin llamar a la página real a través de una solicitud http?Caché de vista de preconstrucción en Rails

Miré soluciones como this y this, pero estas no generan el caché.

Tengo una vista relativamente complicada, y quiero almacenar todo en caché. Quiero precompilar esta versión almacenada en la memoria caché en la aplicación para que cuando un usuario realmente la visite, ya esté allí.

Gracias

Respuesta

0

Creo que el siguiente enlace debe darle un buen comienzo. How do I get the rendered output of a controller's action without visiting the web page?

Trato de lograr lo mismo y, hasta donde puedo ver, su solicitud falsa debe tener el host correcto, porque la clave de caché incluye información de host.

que logra mediante el uso de almacenamiento en caché ActionController :: :: Integración Sesión

ais = ActionController::Integration::Session.new 
ais.host = host 
ais.xml_http_request(:post, url, params, headers) 

Me'v consiguió otro:

Esto también devolverá el objeto respuesta.

+0

Gracias @metaphalon .. lo probaré e informaré. – bgajdero

+0

Esto no funcionó, o al menos no puedo obtenerlo para generar la vista. ais.response devolvió el código generado, pero nto los parciales, y no el caché. ¿Hay alguna forma de procesar la respuesta con HAML desde la consola? – bgajdero

+0

Esto solo generó el caché, no sé qué backend de caché usa. Tendrá que utilizar el servidor de FileStore, porque MemoryStore vivirá en la memoria y cuando cierre el rake (o la consola) se perderán todos los parciales en caché. – metaphalon

2

Teníamos la necesidad de hacer algo similar de una tarea de rake: teníamos un parcial que debería mostrar una lista muy larga de entidades (~ 700) que eran un tanto específicas del contexto y que, debido a una serie de los problemas de la estructura de la base de datos y los criterios de clasificación personalizados tardarían fácilmente más de 25 segundos en renderizar por primera vez antes de entrar en la memoria caché> Esto a menudo expira porque nuestros servidores HTTP se configuraron para terminar solicitudes HTTP sin respuesta después de 30 segundos y precaching esta lista personalizada fue una solución.

Lo que necesita hacer es crear una instancia de ActiveController :: Base, o de uno de sus controladores si necesita métodos auxiliares u otras entidades, luego pase su referencia de lookup_context a una nueva instancia de ActionView.Renderer.

En nuestra tarea rastrillo, que hizo lo siguiente

namespace :rake_for_time_consuming_nonsense do 
    task :pre_cache_long_list do 
    PreCacher.pre_fetch_partials 
    end 
end 

class PreCacher 
    def self.pre_fetch_partials 
    the_controller = ActionController::Base.new 
    # Set any instance variables required by your partial in the controller, 
    # they will be passed to the partial with the view_context reference 
    the_controller.instance_variable_set "@cache_key", cache_key 
    the_controller.instance_variable_set "@the_object", MyModel.first 

    view_renderer = ActionView::Renderer.new the_controller.lookup_context 
    view_renderer.render the_controller.view_context, {partial: 'my_model/the_partial', layout: false} 
    end 
end 

Esto funciona en Rails 3.2.13.

+0

Esto funciona muy bien, pero no puedo usar ayudantes personalizados. ¿Cómo podría incluirlos? – Railsana

Cuestiones relacionadas