Rails caches_action está ignorando before_filters
-
11-12-2019 - |
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.
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.