【问题标题】:public API for controller filter chain?控制器过滤器链的公共 API?
【发布时间】:2014-04-29 14:50:54
【问题描述】:

下面的代码显示了以不同顺序添加了 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

【问题讨论】:

    标签: ruby-on-rails activesupport actionpack


    【解决方案1】:

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

    FooController._process_action_callbacks.collect &:filter
    

    【讨论】:

    • 我在那里闲逛......这是狂野的西部。它可能是一种公共方法,但我不明白它应该用作 API。不仅如此,map(&:filter) 还没有考虑过滤器之前/周围的顺序。
    猜你喜欢
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多