2012-05-19 43 views
12

我有一个控制器,我正在缓存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中的过滤器没有。

回答

25

那么这是一个非常耗时的方式来学习关于缓存的新消息。

事实证明,您必须在要运行的before_filters之后调用caches_action AFTER。我把缓存行为作为我的课堂中的第一件事,所以之前的所有过滤器都没有运行,因为它们在下面。

感谢Pan Thomakos对于his answer包含此宝石的信息 - 这是不是在红宝石文档或我已经掠过它。一旦我设法弥补由于这个小盲点造成的时间损失,我会努力将这些信息添加到文档中。