2012-05-19 9 views
12

Tengo un controlador en el que estoy almacenando en caché la acción de mostrar. La acción mostrar tiene una serie de filtros anteriores para la seguridad que deben ejecutarse y redireccionarse si el usuario no ha iniciado sesión, no es miembro del grupo actual, etc. Estos filtros previos están funcionando perfectamente cuando no activé el almacenamiento en caché, pero cuando cambio el interruptor para activar el almacenamiento en caché antes de que los filtros ya no se ejecuten (mis llamadas al depurador no se activan).Raíles caches_action omitiendo before_filters

Siempre he entendido que antes de los filtros se requieren acciones en caché, siendo esta la principal diferencia entre el caché de páginas y el almacenamiento en memoria caché de acciones. Esto está respaldado por el Rails Caching Tutorial section on action caching que dice:

Acción almacenamiento en caché funciona como caché de páginas excepto por el hecho de que la solicitud Web entrante no ir desde el servidor web a la pila de rieles y Action Pack por lo que antes de los filtros se pueden ejecutar en él antes de que se sirva el caché. Esto permite que la autenticación y otras restricciones se ejecuten mientras se sigue publicando el resultado del resultado de una copia en caché.

¿Por qué no se llaman mis filtros anteriores?

Un poco sobre mi configuración: Rails 3.1 usando Devise para la autenticación. Estoy usando la gema dalli para una tienda memcached.

Aquí hay un código que resume mi código (una gran cantidad de costra cortada):

class GroupsController < ApplicationController 
    caches_action :show 
    cache_sweeper :group_sweeper 

    before_filter :authenticate_user!, :except => [:index] 
    before_filter :init_group, :except => [:new, :create, :index] 
    before_filter :requires_group_membership, :except => [:new, :create, :index] 

    def show 
    end 

    private 

    def requires_group_membership 
    if current_user and [email protected]_active.index(current_user).nil? 
     return true 
    else 
     redirect_to :root 
     return false 
    end 
    end 

    def init_group 
    @group = current_user.active_groups.find_by_id(params[:id]) 

    if @group.nil? 
     redirect_to :root 
     return false 
    end 
    end 

Por lo tanto, ¿alguien ha visto este comportamiento antes? ¿Tengo un agujero en mi comprensión de cómo se supone que los filtros y el almacenamiento en caché de acciones funcionan? ¿O quizás tengo algún vudú raro que ocurre con un extraño combo de versiones de gemas?

[EDIT]

Curiosamente me acabo de enterar que el valor devuelto no ha tener un efecto sobre los métodos sean o no más largo de la cadena se ejecutan, es si una redirección o hacer que se llaman.

[editar 2]

He actualizado mi aplicación a los carriles 3.2.3 para ver si tenía un efecto, pero no fijó el problema. Algo que descubrí es que los filtros anteriores definidos en ApplicationController se están llamando, pero los que están en mi GroupsController no.

Respuesta

25

Bueno, esta ha sido una forma muy lenta de aprender un nuevo tidbit sobre el almacenamiento en caché.

Resulta que debe realizar la llamada a caches_action DESPUÉS los before_filters que desea ejecutar. Tuve la acción de caches como una de las primeras cosas de mi clase, por lo que no se ejecutaban todos los filtros anteriores, ya que estaban debajo.

Gracias a Pan Thomakos por his answer que contenía esta joya de información, que o bien no está en los documentos de rubí O he rozado sobre ella. Me esforzaré por tener esta información agregada a los documentos una vez que haya logrado recuperar el tiempo perdido debido a este pequeño punto ciego.