3

我有一个before_filter使用自定义类的 Ruby on Rails 控制器:

class ApplicationController
  before_filter CustomBeforeFilter      
end

我有另一个控制器继承自ApplicationController,我想跳过CustomBeforeFilter

class AnotherController < ApplicationController
  skip_before_filter CustomBeforeFilter
end

那是行不通的。before_filter仍在执行。

如何在使用自定义类的过滤器之前跳过 Ruby on Rails?

4

3 回答 3

2

您可以将自定义类包装在如下方法中:

before_filter :custom
def custom
  CustomBeforeFilter.filter(self)
end

然后在任何你想要的地方禁用该过滤器

于 2013-02-02T15:16:22.133 回答
2

类回调在添加到过滤器链时会被分配一个随机回调名称。我能想到的唯一方法是首先找到回调的名称:

skip_before_filter _process_action_callbacks.detect {|c| c.raw_filter == CustomBeforeFilter }.filter

如果你想让你的控制器更干净一些,你可以覆盖 ApplicationController 中的 skip_before_filter 方法,让它对所有控制器都可用:

class ApplicationController < ActionController::Base
  def self.skip_before_filter(*names, &block)
    names = names.map { |name|
      if name.class == Class
        _process_action_callbacks.detect {|callback| callback.raw_filter == name }.filter
      else
        name
      end
    }

    super
  end
end

然后你可以这样做:

class AnotherController < ApplicationController
  skip_before_filter CustomBeforeFilter
end
于 2013-02-02T15:31:56.420 回答
1

如果当前控制器是您要跳过的控制器,最简单的解决方案是从您的 before_filter 方法返回:

class CustomBeforeFilter
  def self.filter(controller)
    return if params[:controller] == "another"
    # continue filtering logic
  end
end

编辑:

遵循 phoet 建议,您也可以使用controller.controller_name而不是params[:controller]

于 2013-02-02T15:03:51.640 回答