1

我的 Rails 应用程序有PostMember模型。内posts/:id/show包含一个“喜欢”按钮,会员可以单击该按钮,如果@member已经“喜欢”了这个按钮,则为“不喜欢” @post

(此按钮将链接到执行一些 ajax 并使“喜欢”按钮变为“不喜欢”按钮的发布操作)

缓存按钮的最佳做法是什么?(下面的代码显然没有缓存按钮 html)。

我应该添加:touch => truemember.rb然后为按钮制作一个缓存键<% cache ['V1', @post, @member, 'like_button']吗?(似乎多余?)

post.rb

has_many :likes

喜欢.rb

belongs_to :member
belongs_to :post

成员.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 %>
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 个版本要好。

您在这里冒着有人将代码添加到使用更多 @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 回答