Domanda

Quando Ho 2 viste che frammento di cache stessa interrogazione ma lo schermo in modo diverso, c'è solo un frammento ed entrambi visualizzazione allo stesso modo. C'è un modo per aggirare questo? Per esempio ...

#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
È stato utile?

Soluzione

È necessario utilizzare una chiave di cache unica. Se semplice passaggio in un oggetto che chiama il metodo cache_key su di esso per determinare la chiave. Se si passa in un array di oggetti, cache genererà una chiave unendo le chiavi della cache di tutti gli elementi dell'array. È possibile utilizzare questo per risolvere il problema attraverso:

#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)

Altri suggerimenti

ho capito.

Prima di tutto, il punto centrale di questa strategia è quello di utilizzare le chiavi della cache intelligenti rotaie, che auto-generano chiavi univoche in base al nome del modello, ID, e updated_at attributi.

Che cosa succede se si dispone di contenuti che fa riferimento a due modelli? C'è una convenzione per questo built-in, è sufficiente utilizzare un array:

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

E questo solo aggiunge una chiave utente alla chiave post, in modo che, se o viene aggiornata la cache scade automaticamente. È possibile utilizzare questa stessa convenzione per aggiungere ulteriori informazioni alla chiave sotto forma di una stringa pianura. Questo è utile per distinguere tra i frammenti che attingono alla stessa query, ma richiedono diversi punti di vista, ed è la risposta alla domanda di cui sopra.

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

e poi l'altro uso pagina

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

e questo creerà due frammenti separati che non saranno confusi con l'altro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top