diff options
author | Yehuda Katz <wycats@gmail.com> | 2009-02-27 19:25:45 -0800 |
---|---|---|
committer | Yehuda Katz <wycats@gmail.com> | 2009-02-27 19:25:45 -0800 |
commit | c16c7a8de4e543a92de10a138bdd7caa5ac902d7 (patch) | |
tree | 9bce1aede5774c2c432844b867141bf8415eac2a /actionpack | |
parent | ee80dad680b508a1de1195a9491c7acbae8e0bbc (diff) | |
download | rails-c16c7a8de4e543a92de10a138bdd7caa5ac902d7.tar.gz rails-c16c7a8de4e543a92de10a138bdd7caa5ac902d7.tar.bz2 rails-c16c7a8de4e543a92de10a138bdd7caa5ac902d7.zip |
Add support for callbacks
Diffstat (limited to 'actionpack')
-rw-r--r-- | actionpack/lib/action_controller/abstract/base.rb | 6 | ||||
-rw-r--r-- | actionpack/lib/action_controller/abstract/callbacks.rb | 38 |
2 files changed, 43 insertions, 1 deletions
diff --git a/actionpack/lib/action_controller/abstract/base.rb b/actionpack/lib/action_controller/abstract/base.rb index 6ff4ed8dd2..fe84c0f479 100644 --- a/actionpack/lib/action_controller/abstract/base.rb +++ b/actionpack/lib/action_controller/abstract/base.rb @@ -15,10 +15,14 @@ module AbstractController def process(action_name) @_action_name = action_name - send(action_name) + process_action self.response_obj[:body] = self.response_body self end + def process_action + send(action_name) + end + end end
\ No newline at end of file diff --git a/actionpack/lib/action_controller/abstract/callbacks.rb b/actionpack/lib/action_controller/abstract/callbacks.rb index 61fe9fcdd1..0add363552 100644 --- a/actionpack/lib/action_controller/abstract/callbacks.rb +++ b/actionpack/lib/action_controller/abstract/callbacks.rb @@ -1,5 +1,43 @@ module AbstractController module Callbacks + def self.included(klass) + klass.class_eval do + include ActiveSupport::NewCallbacks + define_callbacks :process_action + extend ClassMethods + end + end + def process_action + _run_process_action_callbacks(action_name) do + super + end + end + + module ClassMethods + def _normalize_callback_options(options) + if only = options[:only] + only = Array(only).map {|o| "action_name == :#{o}"}.join(" && ") + options[:per_key] = {:if => only} + end + if except = options[:except] + except = Array(except).map {|e| "action_name == :#{e}"}.join(" && ") + options[:per_key] = {:unless => except} + end + end + + [:before, :after, :around].each do |filter| + class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1 + def #{filter}_filter(*names, &blk) + options = names.last.is_a?(Hash) ? names.pop : {} + _normalize_callback_options(options) + names.push(blk) if block_given? + names.each do |name| + process_action_callback(:#{filter}, name, options) + end + end + RUBY_EVAL + end + end end end
\ No newline at end of file |