3

我有一個視圖,利用俄羅斯娃娃緩存,其中整個項目的集合被緩存,並且集合中的每個項目緩存單獨緩存。俄羅斯娃娃緩存和基於權限的鏈接在片段

但是,集合中的每個項目都應顯示基於通過CanCan授予的當前用戶權限的編輯/刪除鏈接。因此,用戶A只能看到自己帖子旁邊的編輯/刪除鏈接,但不會在用戶B的帖子旁邊看到。

那麼,無論何時由用戶A創建一個帖子,它都會被緩存,並具有適當的編輯/刪除鏈接,因爲她應該根據她的權限使其可見。但是,當用戶B查看集合時,他爲用戶A的緩存帖子以及他不應該看到的編輯/刪除鏈接提供服務。當然,CanCan可以防止發生這些編輯/刪除操作,但鏈接仍然存在。

無論如何圍繞基於current_user.id創建個人緩存,並防止(幾乎)相同的緩存內容版本的gobs?

回答

1

無論如何圍繞基於current_user.id創建個人緩存並防止(幾乎)相同的緩存內容版本的gobs?

而不是將用戶的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 %> 

注意,緩存鍵代應該可能被提取到一個單獨的類/輔助方法。