Pergunta

Eu tenho um controlador no qual estou armazenando em cache a ação do show.A ação show possui vários filtros before para segurança que devem ser executados e redirecionados se o usuário não estiver logado, não for membro do grupo atual, etc.Esses filtros anteriores estão funcionando perfeitamente quando eu não ativei o cache, mas quando eu ligo a chave para ativar o cache, os filtros anteriores não são mais executados (minhas chamadas do depurador não são atingidas).

Sempre entendi que antes dos filtros serem chamados para ações em cache, sendo esta a principal diferença entre cache de página e cache de ação.Isto é apoiado pelo Seção do tutorial de cache do Rails sobre cache de ação que diz:

O Action Caching funciona como o Page Caching, exceto pelo fato de que a solicitação da web recebida vai do servidor da web para a pilha Rails e o Action Pack, para que os filtros possam ser executados nele antes que o cache seja servido.Isso permite que a autenticação e outras restrições sejam executadas enquanto ainda atende o resultado da saída de uma cópia em cache.

Então, por que meus filtros anteriores não são chamados?

Um pouco sobre minha configuração:Rails 3.1 usando Devise para autenticação.Estou usando a gema dalli para uma loja memcached.

Aqui está um código que resume meu código (muitos detalhes cortados):

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

Então, alguém já viu esse comportamento antes?Tenho uma lacuna na minha compreensão de como os filtros e o cache de ações devem funcionar?Ou talvez eu tenha algum vodu estranho acontecendo com uma combinação estranha de versões de gemas?

[EDITAR]

Curiosamente, acabei de aprender que o valor de retorno não afeta a execução ou não de métodos mais avançados na cadeia, mas sim se um redirecionamento ou renderização é chamado.

[editar 2]

Atualizei meu aplicativo para Rails 3.2.3 para ver se surtiu efeito, mas não resolvi o problema.Algo que descobri é que os filtros anteriores definidos no ApplicationController estão sendo chamados, mas os do meu GroupsController não.

Foi útil?

Solução

Bem, esta tem sido uma maneira muito demorada de aprender um novo detalhe sobre cache.

Acontece que você precisa fazer a chamada para caches_action DEPOIS os before_filters que você deseja executar.Eu coloquei a ação de caches como uma das primeiras coisas da minha aula.Isso significava que todos os filtros anteriores não estavam sendo executados conforme apareciam abaixo/depois de caches_action, e caches_action interrompe a execução do código (e exibe o resultado armazenado em cache).

Graças a Pan Thomakos para a resposta dele que continha esta joia de informação - que não está nos documentos Ruby OU eu a dei uma olhada.Tentarei adicionar essas informações aos documentos assim que conseguir recuperar o tempo perdido devido a esse pequeno ponto cego.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top