gpt4 book ai didi

ruby-on-rails - Rails caches_action 正在跳过 before_filters

转载 作者:行者123 更新时间:2023-12-04 00:15:45 24 4
gpt4 key购买 nike

我有一个 Controller ,我在其中缓存了 show Action 。 show 操作有许多用于安全性的前置过滤器,如果用户未登录,而不是当前组的成员等,它们将执行和重定向。当我没有打开缓存时,这些前置过滤器工作正常,但是当我翻转开关以打开缓存时,不再执行之前的过滤器(我的调试器调用未命中)。

我一直认为在为缓存操作调用过滤器之前,这是页面缓存和操作缓存之间的主要区别。这是由 Rails Caching Tutorial section on action caching 支持的内容如下:

Action Caching works like Page Caching except for the fact that the incoming web request does go from the webserver to the Rails stack and Action Pack so that before filters can be run on it before the cache is served. This allows authentication and other restriction to be run while still serving the result of the output from a cached copy.



那么为什么我的 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

那么,以前有人见过这种行为吗?我对过滤器和 Action 缓存应该如何工作的理解有漏洞吗?或者也许我有一些奇怪的巫术与 gem 版本的奇怪组合一起发生?

[编辑]

有趣的是,我刚刚了解到返回值对是否运行链上的方法没有影响,它是调用重定向还是渲染。

[编辑 2]

我将我的应用程序升级到 rails 3.2.3 以查看它是否有效果,但没有解决问题。我发现的是 ApplicationController 中定义的 before 过滤器被调用,但 GroupsController 中的过滤器没有被调用。

最佳答案

嗯,这是学习有关缓存的新花絮的一种非常耗时的方式。

事实证明,您需要调用 caches_action 您要运行的 before_filters。我已经把缓存操作作为我类的第一件事。这意味着所有之前的过滤器都没有运行,因为它们出现在 caches_action 的下方/之后,并且 caches_action 停止了代码的运行(并提供了缓存的结果)。

感谢 Pan Thomakoshis answer包含这个信息的 gem - 要么不在 ruby​​ 文档中,要么我已经浏览过了。一旦我设法弥补由于这个小盲点而损失的时间,我将努力将这些信息添加到文档中。

关于ruby-on-rails - Rails caches_action 正在跳过 before_filters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10664358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com