3

アイテムのコレクション全体がキャッシュされ、コレクション内の各アイテムがそのキャッシュ内に個別にキャッシュされる、ロシアンドールのキャッシュを利用するビューがあります。

ただし、コレクション内の各アイテムには、CanCan を通じて付与された現在のユーザーのアクセス許可に基づいて、編集/削除のリンクが表示される必要があります。したがって、ユーザー A には、自分の投稿の横にある編集/削除リンクのみが表示され、ユーザー B の投稿の横には表示されません。

ユーザー A が投稿を作成するたびに、適切な編集/削除リンクとともにキャッシュされます。これは、彼女の権限に基づいてそれらを表示する必要があるためです。しかし、ユーザー B がコレクションを表示すると、ユーザー A のキャッシュされた投稿と、表示されるべきではない編集/削除リンクが表示されます。確かに、CanCan はこれらの編集/削除アクションの発生を防ぎますが、リンクは引き続き存在します。

とにかく current_user.id に基づいて個々のキャッシュを作成し、(ほぼ) 同一のキャッシュされたコンテンツのバージョンのゴブを防ぐ方法はありますか?

4

1 に答える 1

1

とにかく current_user.id に基づいて個々のキャッシュを作成し、(ほぼ) 同一のキャッシュされたコンテンツのバージョンのゴブを防ぐ方法はありますか?

ユーザーの 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 %>

キャッシュ キーの生成は、おそらく別のクラス/ヘルパー メソッドに抽出する必要があることに注意してください。

于 2015-03-08T17:28:09.713 に答える