Rails question de la mise en cache d'action
-
15-10-2019 - |
Question
Je ne suis pas sûr de savoir comment assurer ma mise en cache fonctionne, mais je suis sûr que ce n'est pas. J'ai un contrôleur aux utilisateurs une action index que je suis la mise en cache d'action jusqu'à ce qu'un nouvel utilisateur est créé. Voici le code:
UsersController < ApplicationController
caches_action :index
def index
@users = User.all
end
def create
expires_action :index
...
end
end
Maintenant, dans mes journaux quand j'accès à l'action index
, je vois:
Cached fragment hit: views/localhost:3000/users (0.0ms)
Filter chain halted as [#<ActionController::Filters::AroundFilter:0xe2fbd3 @identifier=nil, @kind=:filter, @options={:only=>#<Set: {"index", "new"}>, :if=>nil, :unless=>nil}, @method=#<Proc:0x186cb11@/Users/bradrobertson/.rvm/gems/jruby-1.5.3/gems/actionpack-2.3.10/lib/action_controller/caching/actions.rb:64>>] did_not_yield.
Je ne sais pas ce que le filter chain halted ... did_not_yield
est tout au sujet et je vois aussi que ce select * from users
... est appelé à chaque fois que se, ce qui est pas ce que je pensais.
Quelqu'un peut-il me dire ce qui se passe ici et pourquoi cela ne se comporte pas comme j'attendre? c'est à dire. pourquoi le User.all serait en cours d'exécution lorsque la sortie de cette action tout aurait dû être mis en cache?
La solution
Les moyens de message filter chain halted
qu'il y a un filtre qui arrête autour de l'action de l'appel. Il est probable que le cache d'action, qui arrête l'action réelle de se produire. Il n'a pas rendement à l'action, parce qu'il a trouvé quelque chose dans le cache, comme le suggère le message au-dessus.
Le User.all
ne doit pas être exécuté du tout, parce qu'il est dans l'action, mais avant tout les filtres va se lancer. Si votre page est derrière une certaine forme d'authentification, que le contrôle d'authentification pourrait avoir déclenché l'appel SQL. Donc, vous voudrez peut-être vérifier deux où le journal SQL vient vraiment.
En outre, la syntaxe appropriée (selon le rails de guidage au moins) pour expirer est:
expire_action :action => :index
Plus d'infos: Rails Guide