我有一个控制器,我正在缓存显示动作。显示动作有许多在过滤器之前用于执行和重定向的安全性,如果用户未登录,而不是当前组等的成员。这些在滤波器正完全工作之前,当我没有打开缓存时,当我翻转开关时,在过滤器上不再执行过缓存时(我的调试器呼叫没有命中)。

始终是我的理解,在滤波器调用过滤器之前,这是页面缓存和操作缓存之间的主要区别。这由导轨缓存教程部分备份,读取:

操作缓存等页面缓存,除了传入的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文档,或者我已经脱脂了。一旦我设法抓住由于这个小小的盲点,我将终于将这个信息添加到文档中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top