2012-12-09 36 views
1

我的Rails应用程序有PostMember模型。在posts/:id/show包含一个“喜欢”按钮,会员可以点击,或“不同”如果@member已经“喜欢”这个@post已经。如何分段缓存“喜欢”的按钮? (Rails 3.2,memcached)

(此按钮将链接到一个职位的行动,做一些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 

* 个帖子/ 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 %> 

回答

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个版本更好。

有人将代码添加到like_button部分使用更多@member参数并且不是缓存键的一部分,所以您会得到不正确的结果。

对于这种情况,我会改变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 %> 
+0

你好Tom感谢您的评论。我对“最佳实践”感兴趣 - 看起来像是一个好主意,将like_button部分与页面的其余部分分开缓存?如果邮件还没有被会员喜欢,我还能如何缓存按钮? (或成本足够小?) –

+0

在你的例子中,'like'按钮将是':post'方法 - 这是因为它更容易缓存,而不是使用':get' ...? –

+0

我的示例中的“like”按钮与代码中的完全相同 - 文件的唯一区别在于文件的第一行。 在我的示例中,每个帖子都有2个缓存版本的代码,一个用于喜欢帖子的人,另一个用于不喜欢的人。 最佳实践是尽可能缓存,而不会让系统太难维护。这就是为什么我移动@ member.liked?调用外部的部分,以明确这个值 - 真或假 - 是唯一使这个部分行为不同的东西。 –