Rails Caches_Action正在跳过Breed_Filters
-
11-12-2019 - |
题
我有一个控制器,我正在缓存显示动作。显示动作有许多在过滤器之前用于执行和重定向的安全性,如果用户未登录,而不是当前组等的成员。这些在滤波器正完全工作之前,当我没有打开缓存时,当我翻转开关时,在过滤器上不再执行过缓存时(我的调试器呼叫没有命中)。
始终是我的理解,在滤波器调用过滤器之前,这是页面缓存和操作缓存之间的主要区别。这由导轨缓存教程部分备份,读取:
操作缓存等页面缓存,除了传入的Web请求从Web服务器到Rails Stack和Action Pack之前,以便在筛选之前在Cache服务之前运行筛选之前,请执行此事项。这允许运行身份验证和其他限制,同时仍然从缓存的副本服务的输出结果。
那么为什么我在过滤器之前不是我的呼吁?
关于我的设置:Rails 3.1使用Devise进行身份验证。我正在使用Dalli Gem for Memcached商店。
以下是一些代码总结了我的代码(很多Cruft剪切):
.class GroupsController < ApplicationController caches_action :show cache_sweeper :group_sweeper before_filter :authenticate_user!, :except => [:index] before_filter :init_group, :except => [:new, :create, :index] before_filter :requires_group_membership, :except => [:new, :create, :index] def show end private def requires_group_membership if current_user and !@group.users_active.index(current_user).nil? return true else redirect_to :root return false end end def init_group @group = current_user.active_groups.find_by_id(params[:id]) if @group.nil? redirect_to :root return false end end
所以,有人见过这个行为吗?在我理解过滤器和动作缓存之前,我有一个洞是否应该工作?或者我有一些奇怪的voodo与Gem版本的奇怪组合发生了?
[编辑] 有趣的是我刚刚了解到,返回值没有对运行链条的方法是否进一步的方法,这是一个调用重定向或渲染。
[编辑2]
我将我的应用程序升级到rails 3.2.3看它是否有效,但没有解决问题。我发现的东西是在applicationController中定义的过滤器进行调用,但我的GroupScontroller中的筛选器不是。
解决方案
这是一个非常时刻的方式来学习关于缓存的新的TIDBIT。
事实证明,您需要在要运行的braft_filters之后呼叫caches_action 。我把高速缓存行动放在上课中的第一件事之一。这意味着,在CacheS_Action下面/之后出现之前的滤波器之前,所有之前都不会运行,并且Caches_Action停止了代码的运行(并为缓存的结果提供服务)。 感谢 pan thomakos 他的答案,它包含这个信息的宝石 - 它不适用于Ruby文档,或者我已经脱脂了。一旦我设法抓住由于这个小小的盲点,我将终于将这个信息添加到文档中。