Rails在过滤之前跳过所有内容

时间:2011-05-19 08:39:23

标签: ruby-on-rails

任何人都可以告诉我如何在rails 3中的过滤器之前跳过所有过滤器。

在rails 2.x中我们可以做到

skip_filter filter_chain

但是rails 3中不再支持filter_chain。

由于

7 个答案:

答案 0 :(得分:18)

试试这个

skip_filter *_process_action_callbacks.map(&:filter)

方法_process_action_callbacks应该返回CallbackChain个实例,这是一个Callback的数组 由于Callback#filter获得了回调的名称,因此可以使用:

before_filter :setup
_process_action_callbacks.map(&:filter) #=> [:setup]

答案 1 :(得分:8)

需要跳过所有过滤器可能是由继承自定义ApplicationController引起的。

class ApplicationController < ActionController::Base
  # defines multiple `before_filter`s common to most controllers

class SomeController < ApplicationController
  # this controller may be fine with inheriting all filters

class AnotherController < ApplicationController
  # but this one not!

在我的示例方案中,不要从before_filter移除AnotherController,而是让它从ActionController::Base继承。

答案 2 :(得分:3)

没试过,但这可能有效:

[:before, :after, :around].each {|type| reset_callbacks(type)}

答案 3 :(得分:2)

如果要指定:only或:skip_filter除外,请使用以下命令:

skip_filter(:only => [:method1, :method2], *_process_action_callbacks.map(&:filter))
Xavier Shay让我朝着正确的方向前进,但后来我挣扎了一下,弄清楚我必须放下:只有在跳过过滤器列表之前!

编辑:上面的解决方案适用于RUby 1.8.7。对于Ruby 1.9,您可以:

skip_filter(*_process_action_callbacks.map(&:filter), :only => [:method1, :method2])

答案 4 :(得分:1)

对于Rails 5,我用过

class SomeController < ApplicationController    

  skip_before_action *_process_action_callbacks.map{|callback| callback.filter if callback.kind == :before}.compact

您必须检查callback.kind,否则_process_action_callbacks将返回所有回调,包括afteraround,这将使用skip_before_action方法引发异常。

最后的.compact从结果数组中删除nils

答案 5 :(得分:0)

这肯定是在Rails腹部内部进行深入攻击,你最好手动指定回调,但是以下行将完成这项工作:

eval %[skip_filter #{_process_action_callbacks.select { |c|
    [:before, :after, :around].include? c.kind }.collect{|c|
      c.filter.inspect}.join(", ")
    }]

您还可以在结束:only => :index之前向eval添加]等修改,以便在需要时进一步修改调用。

答案 6 :(得分:-4)