控制器过滤链的公共API?

时间:2014-04-29 14:50:55

标签: ruby-on-rails activesupport actionpack

下面的代码显示了两个以不同顺序添加before_filters的控制器。因此,控制器具有不同的行为。

当current_user为nil(已注销)时:

  • FooController - >重定向到login_path
  • BarController - >重定向到root_path

当然,你可以将这两种方法结合起来,让它们变得更聪明,使这个具体的例子消失 - 但这就错过了这个问题。

现在的问题是,在ActionController中,过滤器添加的顺序是相关的。 (你也可以说这个实现并不是最好的,但它是怎么回事 - 所以让我们继续前进)

由于ActionController的工作方式,我想测试一下这种行为。但是,没有必要在每个单独的操作(而不是DRY)上测试前过滤器的结果。据我所知,实际上重要的是每个操作的过滤器链的结果顺序

before_filter :require_user实际做的唯一事情就是将一个项目注入回调链 - 这就是我应该在我的子类中测试的所有东西 - 在链中添加了一个额外的项目。我不需要测试require_user对我的行为的影响 - 它们可以而且应该被删除。

所有人都说,这里有钱的问题:是否有一个公共API可以返回给定控制器和动作过滤器链中的哪些方法?这应包括按适当顺序在过滤器之前,之后和周围。

class ApplicationController < ActionController::Base
  def require_user
    unless current_user
      redirect_to login_path and return
    end
  end
  def require_admin
    unless current_user.try(:admin?)
      redirect_to root_path and return
    end
  end
end

class FooController < ApplicationController
  before_filter :require_user
  before_filter :require_admin
end

class BarController < ApplicationController

  # reverse the order of the filters

  before_filter :require_admin
  before_filter :require_user
end

1 个答案:

答案 0 :(得分:0)

您可以通过_process_action_callbacks类方法访问过滤器列表。有关过滤器列表,您可以:

FooController._process_action_callbacks.collect &:filter