我有一个控制器,我正在缓存show操作。 show action中有一些过滤前的安全性过滤器,如果用户没有登录,而不是当前组的成员,那么这些过滤器会执行并重定向。当我没有打开缓存时,这些过滤器工作正常,但当我翻转开关以关闭缓存之前,过滤器不再执行(我的调试器调用未命中)。Rails caches_action正在跳过before_filters
一直以来我的理解是,在调用缓存操作的过滤器之前,这是页面缓存和操作缓存之间的主要区别。
动作缓存就像页面缓存,除了一个事实,即传入Web请求并从网络服务器到Rails的堆栈和行动宝盒去,这样的过滤器才能运行:这是由Rails Caching Tutorial section on action caching读取备份在缓存服务之前就可以了。这允许运行身份验证和其他限制,同时仍提供缓存副本的输出结果。
那么,为什么我之前没有过滤器被调用?
有关我的设置:Rails 3.1使用Devise进行身份验证。我正在使用dalli gem作为memcached商店。
下面是一些代码,总结我的代码(很多克鲁夫特的切出):
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 [email protected]_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?
[编辑]
有趣的是我刚刚获悉,返回值还没有对是否没有方法的进一步沿着链的运行产生影响,这是一个重定向或渲染是否被调用。
[编辑2]
我升级我的应用程序导轨3.2.3,看它是否有效果,但并没有解决问题。我发现的一点是,ApplicationController中定义的前面的过滤器正在调用,但我的GroupsController中的过滤器没有。