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.