任何人都可以告诉我如何在rails 3中的过滤器之前跳过所有过滤器。
在rails 2.x中我们可以做到
skip_filter filter_chain
但是rails 3中不再支持filter_chain。
由于
答案 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))
编辑:上面的解决方案适用于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将返回所有回调,包括after
和around
,这将使用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)