Русская кукла кеширования и разрешения на основе ссылок в виде фрагмента
У меня есть представление, которое использует кэширование Russian Doll, когда вся коллекция элементов кэшируется, и каждый элемент коллекции кэшируется индивидуально в этом кэше.
Однако каждый элемент в коллекции должен содержать ссылки на редактирование / удаление, основанные на разрешениях текущего пользователя, предоставленных через CanCan. Таким образом, пользователь А будет видеть ссылки редактирования / удаления рядом со своими собственными сообщениями, но не рядом с сообщениями пользователя Б.
Что ж, всякий раз, когда пост создается пользователем A, он кэшируется с соответствующими ссылками редактирования / удаления, поскольку он должен иметь их видимыми на основе своих разрешений. Но когда пользователь B просматривает коллекцию, он обслуживает кэшированное сообщение пользователя A вместе со ссылками редактирования / удаления, которые он не должен видеть. Конечно, CanCan предотвращает эти действия редактирования / удаления, но ссылки все еще присутствуют.
Есть ли какой-либо способ создания отдельных кэшей на основе current_user.id и предотвращения создания версий (почти) идентичного кэшированного контента?
1 ответ
Есть ли какой-либо способ создания отдельных кэшей на основе current_user.id и предотвращения создания версий (почти) идентичного кэшированного контента?
Вместо включения идентификатора пользователя в ключ кеша, вы можете включить разрешения пользователей. Это все равно будет иметь дубликаты контента, но масштабируется в соответствии с вашей моделью разрешения, а не количеством пользователей. Так что вместо типичного:
<% cache("posts/all-#{Post.maximum(:updated_at).try(:to_i)}") do %>
...
<% end %>
Вы можете создать ключ кеша, как (предполагая, current_user
возвращает аутентифицированного пользователя), и вам нужно только редактирование и чтение:
<% cache("posts/all-#{Post.maximum(:updated_at).try(:to_i)}-#{current_user.can?(:edit, Post) ? :edit : :read}") do %>
...
<% end %>
Обратите внимание, что генерация ключа кэша, вероятно, должна быть извлечена в отдельный метод класса / помощника.