下面的代码显示了两个以不同顺序添加before_filters的控制器。因此,控制器具有不同的行为。
当current_user为nil(已注销)时:
当然,你可以将这两种方法结合起来,让它们变得更聪明,使这个具体的例子消失 - 但这就错过了这个问题。
现在的问题是,在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
答案 0 :(得分:0)
您可以通过_process_action_callbacks类方法访问过滤器列表。有关过滤器列表,您可以:
FooController._process_action_callbacks.collect &:filter