Ho un controller in cui sto memorizzando nella cache l'azione dello show. L'azione mostra ha una serie di filtri antecedenti per la sicurezza che sono pensati per eseguire e reindirizzare se l'utente non ha effettuato l'accesso, non un membro del gruppo corrente ecc. Questi prima che i filtri funzionino perfettamente quando non ho attivato la memorizzazione nella cache, ma quando capovolgo l'interruttore per attivare il caching sui filtri precedenti non vengono più eseguiti (le mie chiamate al debugger non vengono colpite).Rails caches_action sta saltando before_filters
Ho sempre compreso che prima di chiamare i filtri per le azioni memorizzate nella cache, questa è la differenza principale tra il caching delle pagine e il caching delle azioni. Questo è sostenuta dalla Rails Caching Tutorial section on action caching che recita:
azione Caching funziona come caching delle pagine tranne per il fatto che la richiesta Web in ingresso dovesse andare dal server web alla pila Rails e Action Pack in modo che prima di filtri possono essere eseguiti su di esso prima che la cache sia servita. Ciò consente di eseguire l'autenticazione e altre restrizioni mentre continua a servire il risultato dell'output da una copia memorizzata nella cache.
Quindi, perché i miei filtri non vengono richiamati?
Un po 'sulla mia configurazione: Rails 3.1 utilizzando Devise per l'autenticazione. Sto usando la gemma dalli per un negozio memcached.
Ecco alcuni codice che riassume il mio codice (un sacco di cruft tagliato):
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
Così, qualcuno ha visto questo comportamento prima? Ho un buco nella mia comprensione di come i filtri e il caching delle azioni dovrebbero funzionare prima? O forse ho qualche strano voodo che accade con una strana combinazione di versioni gemme?
[EDIT]
interessante ho appena appreso che il valore restituito non ha un effetto sui metodi o meno lungo la catena vengono eseguiti, è se un reindirizzamento o rendere sono chiamati.
[modifica 2]
ho aggiornato il mio app per rotaie 3.2.3 per vedere se ha avuto un effetto, ma non risolvere il problema. Qualcosa che ho scoperto è che i primi filtri definiti in ApplicationController vengono richiamati, ma quelli del mio GroupsController no.