質問

フラグメントを同じクエリをキャッシュしますが、異なる方法で表示する2つのビューがある場合、フラグメントは1つだけで、どちらも同じ方法で表示されます。これを回避する方法はありますか?例えば...

#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、およびupdated_at属性に基づいて一意のキーを自動生成するRailsのインテリジェントキャッシュキーを利用することです。

2つのモデルを指すコンテンツがある場合はどうなりますか?この組み込みのコンベンションがあり、配列を使用するだけです。

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

そしてこれは、投稿キーにユーザーキーを追加するだけです。 また 更新されますキャッシュは自動的に有効です。この同じコンベンションを使用して、プレーンストリングの形でキーに追加情報を追加できます。これは、同じクエリを描くが異なるビューを必要とするフラグメントを区別するのに役立ち、上記の質問に対する答えです。

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

そして、他のページで使用します

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

そして、これにより、互いに混同されない2つの別々のフラグメントが作成されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top