2012-02-24 13 views
17

Estoy usando Ruby on Rails 3.1 y me gustaría saber (para rendimiento razones) si el after_filter se ejecuta después de que se visualicen los archivos de vista. Es decir, cuando un usuario accede a la URL de mi aplicación, el archivo de vista relacionado que debe mostrar se procesa antes de que se ejecute after_filter o se ejecute after_filter antes de que se muestre el archivo de vista.¿Cómo/cuándo funciona el 'after_filter'?

En otras palabras, las aplicaciones de servidor comienza a enviar los datos de vista prestados al usuario antes de ejecutar el after_filter o se espera para ejecutar el método after_filter y sólo entonces se envía esos datos de vista?

P.S.: Abrí esta pregunta porque me gustaría ejecutar algunas actualizaciones del sistema (nota: estas actualizaciones no afectan los datos de salida de la vista y no son "utilizadas por"/"necesarias para" la vista en absoluto) sin impacto en la experiencia del usuario final (por ejemplo: carga lenta de las páginas web de mi aplicación).

Respuesta

11

Debe tener en cuenta que una solicitud a su servidor es totalmente coherente y se ejecuta en su propio hilo.

Si coloca el código en un after_filter, esto retrasará toda la solicitud: para resumir mal, si el hilo está activo, la página no se entrega.

Es por eso que encuentras grandes complementos como DelayedJob y Resque, funcionan en un proceso paralelo y no afectarán a tu aplicación.


Para responder a su pregunta original, after_filter se activan después de que el vistas ha sido procesada.

Esto es a veces una molestia por eso people created some before_render filters.

5

after_filter se ejecuta después de que el contenido se ha generado, pero antes de que se haya enviado al cliente. Puede verificar que esto sea así porque tiene acceso a los datos de respuesta generados por completo en el método response de su controlador en cualquier after_filter.

After_filters son lugares inadecuados para realizar tareas de ejecución prolongada, ya que definitivamente afectarán la experiencia de los usuarios. Considere utilizar el after_filter para iniciar una tarea larga delayed_job o resque para realizar su trabajo en segundo plano.