1

私のRailsアプリにはモデルがPostありMemberます。中posts/:id/showには、メンバーがクリックできる「いいね」ボタンが含まれています。すでに@memberこれを「いいね」している場合は「いいね」ボタンがあります@post

(このボタンは、いくつかのajaxを実行し、「いいね」ボタンを「いいね」ボタンに変更する投稿アクションにリンクします)

ボタンをキャッシュするためのベストプラクティスは何ですか?(以下のコードは明らかにボタンのhtmlをキャッシュしません)。

に追加:touch => trueしてからmember.rb、ボタンのキャッシュキーを作成する必要があります<% cache ['V1', @post, @member, 'like_button']か?(冗長なようですか?)

post.rb

has_many :likes

like.rb

belongs_to :member
belongs_to :post

member.rb

has_many :likes

* posts / show.html.erb *

<% cache ['V1', @post, 'show'] do %>
  <h1>@post.title</h1>
  <div class="content">@post.content</div>
<% end %> 
  <%= render 'like_button', :post=> @post, :member => @member %> 

**投稿/_like_button.html.erb**

<% if member.liked_post?(post) %> 
  <%= link_to unlike_post_path(post), :method => :post, :remote => true, :class => 'btn' %>
<% else %> 
  <%= link_to like_post_path(post), :method => :post, :remote => true, :class => 'btn' %>  
<% end %>
4

1 に答える 1

2

あなたはこれらの線に沿って何かをすることができます:

<% cache ['V1', @post, @member.liked_post?(@post), 'show'] do %>
  <h1>@post.title</h1>
  <div class="content">@post.content</div>
  <%= render 'like_button', :post=> @post, :member => @member %> 
<% end %> 

これにより、2つの異なるキャッシュバージョンのフラグメントが提供されます。1つは「いいね」と「嫌い」の状態です。これは、ユーザーごとに1つのバージョンよりも優れています。

ここで誰かが@memberパラメーターをより多く使用するlike_buttonパーシャルにコードを追加するリスクがあり、それはキャッシュキーの一部ではないため、誤った結果が得られます。

この場合、like_button部分を変更して、キャッシュ呼び出しと同じパラメーター(@ member.liked_post(@post))を取得し、これが部分コード内で使用される唯一の値であることを明確にします。

<%= render 'like_button', :post=> @post, :liked => @member.liked(@post) %> 

新しいパーシャルで:

<% if liked %> 
  <%= link_to unlike_post_path(post), :method => :post, :remote => true, :class => 'btn' %>
<% else %> 
  <%= link_to like_post_path(post), :method => :post, :remote => true, :class => 'btn' %>  
<% end %>
于 2012-12-25T06:55:01.633 に答える