Frage

Wenn ich zwei Ansichten, die Fragment-Cache die gleiche Abfrage BUT zeigt sie anders, gibt es nur ein Fragment und sie beide Anzeige es die gleiche Weise. Gibt es eine Möglichkeit, um dieses? Zum Beispiel ...

#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
War es hilfreich?

Lösung

Sie haben einen einzigartigen Cache Schlüssel zu verwenden. Wenn Sie einfache Pass in einem Objekt ruft er die cache_key Methode auf den Schlüssel zu bestimmen. Wenn Sie in einem Array von Objekten übergeben, wird cache einen Schlüssel generieren, indem die Cache-Schlüssel aller Elemente des Arrays verbinden. Damit können Sie Ihr Problem durch beheben:

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

Andere Tipps

dachte ich es aus.

Zunächst einmal der ganze Sinn dieser Strategie ist die Verwendung des intelligenten Cache-Schlüssels in Schienen zu machen, die automatisch zu generieren eindeutige Schlüssel basierten auf dem Modellnamen, ID und updated_at Attribute.

Was ist, wenn Sie Inhalte, die auf zwei Modelle beziehen? Es ist eine Konvention für diese eingebaut, Sie einfach ein Array verwenden:

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

Und das hängt nur einen Benutzerschlüssel an die Schlüsselstellen, so dass, wenn entweder aktualisiert wird, um den Cache läuft automatisch. Sie können diese gleiche Konvention verwenden, um zusätzliche Informationen zu dem Schlüssel in Form einer einfachen Zeichenfolge hinzuzufügen. Dies ist nützlich für die Unterscheidung zwischen den Fragmenten, die auf der gleichen Abfrage ziehen, sondern erfordern unterschiedliche Ansichten, und ist die Antwort auf die Frage oben.

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

und dann auf der anderen Seite der Verwendung

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

und dies zwei getrennte Fragmente erstellen, die nicht miteinander verwechselt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top