ActionController filter chain question

Hey all, wondering about ActionController filter chains. EX:

require ‘rubygems’
require ‘action_controller’

class Tray < ActionController::Base
before_filter :aud

def aud
puts “AUD”
end

def run
puts “RUN”
end
end

f = Tray.new
f.run

Should actioncontroller alone implement failter chains? This example
only spits out “RUN” but i’m trying to find a way to execute the full
filter_chain by itself, not depending on Rails at all…

Any ideas?
Thanks

Aaron S. wrote:

Hey all, wondering about ActionController filter chains. EX:

require ‘rubygems’
require ‘action_controller’

class Tray < ActionController::Base
before_filter :aud

def aud
puts “AUD”
end

def run
puts “RUN”
end
end

f = Tray.new
f.run

Should actioncontroller alone implement failter chains? This example
only spits out “RUN” but i’m trying to find a way to execute the full
filter_chain by itself, not depending on Rails at all…

Any ideas?
Thanks

Got it::

require ‘rubygems’
require ‘action_controller’

class ActionTest < ActionController::Base

before_filter :login
before_filter { |controller| puts “BEFORE PROC FILTER” }
prepend_before_filter :aud
after_filter { |controller| puts “PROC AFTER FILTER” }
append_after_filter :aft
after_filter :run

around_filter do |controller, action|
logger.debug “before #{controller.action_name}”
action.call
logger.debug “after #{controller.action_name}”
end

def login
puts “LOGIN”
end

def aud
puts “AUD”
end

def run
puts “RUN”
end

def aft
puts “AFT”
end

def target
puts “TARGET BIOTCH”
end
end

class ActionController::Base

def run_target_with_filters(method,controller)
afters = []
befores = []

#populate the before and after arrays
controller.filter_chain.each do |fl|
if(fl.inspect.to_s.match(/BeforeFilter/))
befores << fl
elsif(fl.class.to_s.match(/AfterFilter/))
afters.unshift(fl)
end
end

befores.each do |fl|
begin
if(fl.inspect.to_s.match(/Proc/) != nil)
fl.filter.call(controller)
#elsif(fl.inspect.to_s.match(/ProcWithCallFilter/))
# fl.filter.call(controller, ?action?)
else
controller.send(fl.filter.to_s)
end
rescue LocalJumpError => e
next
end
end

#Call target Method
controller.send(method)

#Call afters
afters.each do |fl|
begin
if(fl.inspect.to_s.match(/Proc/) != nil)
fl.filter.call(controller)
#elsif(fl.inspect.to_s.match(/ProcWithCallFilter/))
# fl.filter.call(controller,?action?)
else
controller.send(fl.filter.to_s)
end
rescue LocalJumpError => e
next
end
end
end
end

f = ActionTest.new
f.run_target_with_filters(:target, f)

One thing it doesn’t handle is around_filters… looking into that still.