2010-05-01 7 views
0

Lorsque j'ai 2 vues qui fragmentent le cache de la même requête MAIS les affichent différemment, il n'y a qu'un seul fragment et ils l'affichent tous les deux de la même manière. Y at-il un moyen de contourner cela? Par exemple ...Memcached et Rails Fragment Caching Problème

#views/posts/list 
    - cache(@posts) do 
     - for p in @posts 
       = p.title 

#views/posts/list_with_images 
    - cache(@posts) do 
     - for p in @posts 
       = p.title 
       = p.content 
       = image_tag(p.image_url) 

#controllers/posts_controller 
    def list 
     ... 
     @posts = Post.all 
    end 

    def list_with_images 
     ... 
     @posts = Post.all 
    end 

Répondre

5

Vous devez utiliser une clé de cache unique. Si vous passez simplement un objet, il appelle la méthode cache_key pour déterminer la clé. Si vous transmettez un tableau d'objets, cache va générer une clé en joignant les clés de cache de tous les éléments du tableau. Vous pouvez l'utiliser pour résoudre votre problème via:

#views/posts/list 
    - cache([:list, @posts]) do 
     - for p in @posts 
       = p.title 

#views/posts/list_with_images 
    - cache([:list_with_images, @posts]) do 
     - for p in @posts 
       = p.title 
       = p.content 
       = image_tag(p.image_url) 
1

Je l'ai compris. Tout d'abord, le but de cette stratégie est d'utiliser les clés de cache intelligentes dans les rails, qui génèrent automatiquement des clés uniques en fonction des attributs name, ID et updated_at du modèle.

Et si vous avez un contenu qui fait référence à deux modèles? Il y a une convention pour ce intégrée, vous utilisez simplement un tableau:

- cache([@posts, @user]) do 

Et cela juste ajoute une clé utilisateur à la clé de messages, de sorte que si soit est mis à jour le cache expire automatiquement. Vous pouvez utiliser cette même convention pour ajouter des informations supplémentaires à la clé sous la forme d'une chaîne simple. Ceci est utile pour distinguer les fragments qui utilisent la même requête mais nécessitent des vues différentes, et constitue la réponse à la question ci-dessus.

- cache([@posts, "lists"]) do 

puis sur l'autre utilisation de la page

- cache([@posts, "list_with_images"]) do 

et cela va créer deux fragments distincts qui ne seront pas confondus avec l'autre.