我正在尝试在我的论坛中实现缓存,而困难的部分是保留角色&基团。
所以一个似乎很好的解决方案是使用动作缓存来运行一些before_filter
并在proc中定义cache_path
。
class Forums::TopicsController < Forums::BaseController
before_filter :authenticate_user!, except: :show
before_filter :load_resources
cache_sweeper :topic_sweeper
caches_action :show, cache_path: proc {
if user_signed_in?
if @topic.user == current_user || current_user.has_role?(:moderator) || current_user.has_role?(:superadmin)
"author_forum_topic_#{@topic.id}"
end
else
forum_topic_path(@forum, @topic)
end
}
def show
@post = Fo::Post.new
end
def create
# ...
end
private
def load_resources
@forum = Fo::Forum.find(params[:forum_id])
@category = @forum.category
@topic = @forum.topics.find(params[:id]) if !%w(create new).include?(action_name)
if %w(show).include?(action_name)
authorize! :read, @topic
@topic.register_view_by(current_user)
end
end
end
这个控制器看起来很简单,但类别/论坛列表是“组”可访问的,所以在这里我可以在cache_path中构建一组group id
您如何看待这些缓存实践?
答案 0 :(得分:2)
答案 1 :(得分:0)
考虑使用fragment caching。您可以缓存整个帖子或仅缓存其中的一部分。在我们的社交应用程序中,我们使用它来缓存墙上的帖子 - 显示用户信息的部分和帖子正文。具有诸如“删除”,“编辑”,“报告”之类的按钮的部分是根据用户的类型在每个负载上生成的,例如,所有者可以删除或编辑,但非所有者只能报告。
Fragment caching在视图中执行。