Question

J'ai un contrôleur dans lequel je mettant la mise en cache de l'action du spectacle. L'action de spectacle comporte un certain nombre de filtres de sécurité destinés à exécuter et à rediriger si l'utilisateur n'est pas connecté, et non membre du groupe actuel, etc. Celles-ci avant que les filtres fonctionnent parfaitement lorsque je n'ai pas allumé la mise en cache, mais Lorsque je retourne le commutateur pour activer la mise en cache sur les filtres avant que les filtres ne sont plus exécutés (mes appels de débogueur ne sont pas touchés).

Cela a toujours été construit que, avant que les filtres ne soient appelés à des actions en cache, cela étant la principale différence entre la mise en cache de la page et la mise en cache d'action. Ceci est sauvegardé par le Tutoriel de mise en cache de rails sur la mise en cache d'action qui lit:

La mise en cache d'action fonctionne comme la mise en cache de page, à l'exception du fait que la requête Web entrante passe du serveur Web à partir du serveur Web sur la pile et l'action d'action de Rails, de sorte que avant que les filtres puissent s'exécuter avant que le cache soit servi avant que le cache soit servi. Cela permet d'exécuter l'authentification et d'autres restrictions tout en servant toujours le résultat de la sortie d'une copie mise en cache.

Alors pourquoi mes avant les filtres ne sont-ils pas appelés?

Un peu sur ma configuration: Rails 3.1 Utilisation du congé pour l'authentification. J'utilise le gemme Dalli pour un magasin memcached.

Voici quelques codes qui résument mon code (beaucoup de cruft découpé):

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

Alors, a-t-il déjà vu ce comportement? Est-ce que j'ai un trou dans ma compréhension de la façon dont les filtres et la mise en cache d'action sont censés travailler? Ou peut-être que j'ai un vaudou bizarre qui se passe avec une combinaison étrange de versions gemmes?

[modifier]

Il est intéressant de noter que je viens d'apprendre que la valeur de retour n'a pas d'effet sur les méthodes ou non le long de la chaîne sont exécutées, il est de savoir si une redirection ou un rendu sont appelés.

[modifier 2]

J'ai mis à niveau mon application aux rails 3.2.3 Pour voir si cela avait un effet, mais n'a pas réparer le problème. Quelque chose que j'ai découvert est que les filtres avant définis dans ApplicationController sont appelés, mais ceux de mon groupeController ne sont pas.

Était-ce utile?

La solution

Eh bien, cela a été un moyen très temporel d'apprentissage d'une nouvelle TDREBIT sur la mise en cache.

Il s'avère que vous devez faire appel à Caches_Action après les anvioles que vous souhaitez exécuter.J'avais placé l'action de caches comme l'une des premières choses de ma classe.Cela signifiait que tous les filtres avant n'étaient pas exécutés, car ils sont apparus ci-dessous / après la Caches_Action, et Caches_Action arrête le fonctionnement du code (et sert le résultat mis en cache).

merci à Pan Thomakos pour Sa réponse qui contenait ce gemme d'informations - ce qui n'est pas dans les documents rubis ou je l'ai écrémé.J'endevourez-moi d'avoir cette information ajoutée aux docs une fois que j'ai réussi à retrouver le temps perdu en raison de ce petit aveugle.

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