Вопрос

Когда у меня есть 2 просмотра, что фрагмент кэширует тот же запрос, но отображать их по-разному, существует только один фрагмент, и они оба отображают его так же. Есть ли вокруг этого? Например...

#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
Это было полезно?

Решение

Вы должны использовать уникальный ключ кэширования. Если вы простой проходите в объекте, он называет cache_key Метод на нем, чтобы определить ключ. Если вы проходите в массиве объектов, cache Создает ключ, присоединившись к ключам кэша всех элементов массива. Вы можете использовать это, чтобы исправить свою проблему через:

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

Другие советы

Я понял.

Прежде всего, вся точка этой стратегии состоит в том, чтобы использовать интеллектуальные клавиши кэша в рельсах, которые автоматически генерируют уникальные ключевые ключи на основе имени модели, ID и AUPLIED_AT атрибутов.

Что, если у вас есть контент, который относится к двум моделям? Есть конвенция для этого встроенного, вы просто используете массив:

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

И это просто добавляет ключ пользователя к ключу постов, чтобы, если либо обновляется кеш автоматически истекает. Вы можете использовать эту же конвенцию, чтобы добавить дополнительную информацию в ключ в виде простой строки. Это полезно для различения фрагментов, которые рисуют на одном получении, но требуют разных представлений, и является ответом на вопрос выше.

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

а затем на другой странице пользуется

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

И это создаст два отдельных фрагмента, которые не будут путать друг с другом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top