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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top