2012-05-19 14 views
12

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.

risposta

25

Bene, questo è stato un modo molto ponderato per imparare un nuovo bocconcino sul caching.

Si scopre che è necessario effettuare la chiamata a caches_action DOPO i before_filters che si desidera eseguire. Ho avuto l'azione sulle cache come una delle prime cose nella mia classe, quindi tutti i filtri precedenti non venivano eseguiti come lo erano al di sotto di esso.

Grazie a Pan Thomakos per his answer che conteneva questo gioiello di informazioni - che non è nei documenti ruby ​​O che ho sfiorato. Farò in modo di avere queste informazioni aggiunte ai documenti una volta che sono riuscito a recuperare il tempo perso a causa di questo piccolo punto cieco.

Problemi correlati