Domanda

Ho un controller in cui sto memorizzando nella cache l'azione dello spettacolo. L'azione Mostra ha un numero di filtri prima della sicurezza che intende eseguire e reindirizzare se l'utente non è connesso, non un membro del gruppo corrente ecc. Questi prima dei filtri funzionano perfettamente quando non ho acceso la memorizzazione nella cache, ma Quando capovolgo il passaggio per attivare la memorizzazione nella cache sui filtri prima che non vengano più eseguiti (le mie chiamate di debugger non sono colpite).

È sempre stato la mia comprensione che prima che i filtri siano chiamati per le azioni memorizzate nella cache, questa è la principale differenza tra la memorizzazione nella cache e la memorizzazione nella cache di azione. Questo è supportato da rotaia Caching tutorial Sezione sulla cache dell'azione che legge:

.

Azione La memorizzazione nella cache funziona come la cache della pagina tranne che per il fatto che la richiesta Web in entrata passa dal webserver alla pila di binari e dal pacco azione in modo che prima dei filtri possano essere eseguiti su di esso prima che la cache sia servita. Ciò consente di eseguire l'esecuzione di autenticazione e di altra restrizione pur servendo il risultato dell'output da una copia memorizzata nella cache.

Allora perché non sono i miei prima i filtri che vengono chiamati?

Un bit sulla mia configurazione: rotaie 3.1 utilizzando Devise per l'autenticazione. Sto usando il gemma Dalli per un negozio Memcached.

Ecco alcuni codice che riassume il mio codice (un sacco di cuft 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 !@group.users_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
.

Allora, qualcuno ha visto questo comportamento prima? Ho un buco nella mia comprensione di come prima dei filtri e nella cache d'azione dovrebbe funzionare? O forse ho un po 'strano che accadono con una combinazione strana di versioni Gem?

[modifica]

Interessantemente ho appena appreso che il valore di ritorno non ha avuto un effetto sui metodi o meno più avanti lungo la catena, è se viene chiamato un reindirizzamento o un rendering.

[modifica 2]

Ho aggiornato la mia app a rotaie 3.2.3 per vedere se avesse un effetto, ma non ha risolto il problema. Qualcosa che ho scoperto è che prima i filtri definiti in applicationController vengono chiamati, ma quelli nel mio GroupController non lo sono.

È stato utile?

Soluzione

Beh, questo è stato un modo molto temporalizzante per imparare un nuovo tidbit sulla cache.

Si scopre che è necessario effettuare la chiamata a caches_action dopo i primi_filter che si desidera eseguire.Avevo posto l'azione della cache come una delle prime cose della mia classe.Ciò significava che tutti i filtri prima che non siano stati eseguiti come appaiono sotto / dopo la caches_action, e caches_action blocca il funzionamento del codice (e serve il risultato memorizzato nella cache).

Grazie a Pan Thomakos per La sua risposta che conteneva questo gioiello di informazioni - che non sia nei documenti rubini o mi sono scremato sopra.Eliminerò per avere queste informazioni aggiunte ai documenti una volta che sono riuscito ad artigare il tempo perso a causa di questo piccolo Blindspot.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top