【发布时间】:2012-05-26 17:17:14
【问题描述】:
我有一个控制器,我在其中缓存显示操作。 show 操作有许多用于安全的 before 过滤器,如果用户未登录,而不是当前组的成员等,这些过滤器将执行和重定向。当我没有打开缓存时,这些 before 过滤器可以正常工作,但是当我拨动开关以在不再执行过滤器之前打开缓存时(我的调试器调用未命中)。
我一直认为,在为缓存操作调用过滤器之前,这是页面缓存和操作缓存之间的主要区别。这由Rails Caching Tutorial section on action caching 支持,内容如下:
动作缓存的工作方式与页面缓存类似,不同之处在于传入的 Web 请求确实从 Web 服务器发送到 Rails 堆栈和 Action Pack,以便在提供缓存之前可以在其上运行之前的过滤器。这允许运行身份验证和其他限制,同时仍提供缓存副本的输出结果。
那么为什么不调用我的 before 过滤器呢?
关于我的设置: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 !@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
那么,有没有人见过这种行为?我对过滤器和动作缓存应该如何工作之前的理解是否存在漏洞?或者也许我有一些奇怪的巫毒发生在一个奇怪的 gem 版本组合中?
[编辑]
有趣的是,我刚刚了解到,返回值对是否运行更远的方法没有影响,而是调用重定向或渲染。
[编辑 2]
我将我的应用升级到 rails 3.2.3 以查看它是否有效果,但没有解决问题。我发现,ApplicationController 中定义的前置过滤器被调用了,但我的 GroupsController 中的过滤器没有。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 caching action-caching