diff --git a/actionpack/lib/action_controller/dispatch/dispatcher.rb b/actionpack/lib/action_controller/dispatch/dispatcher.rb index 091cc49412..bb9d8bd063 100644 --- a/actionpack/lib/action_controller/dispatch/dispatcher.rb +++ b/actionpack/lib/action_controller/dispatch/dispatcher.rb @@ -66,7 +66,8 @@ module ActionController define_callbacks :prepare_dispatch, :before_dispatch, :after_dispatch def initialize - @app = @@middleware.build(lambda { |env| self.dup._call(env) }) + @app = @@middleware.build(lambda { |env| self._call(env) }) + freeze end def call(env) @@ -74,8 +75,18 @@ module ActionController end def _call(env) - @env = env - dispatch + begin + run_callbacks :before_dispatch + Routing::Routes.call(env) + rescue Exception => exception + if controller ||= (::ApplicationController rescue Base) + controller.call_with_exception(env, exception).to_a + else + raise exception + end + ensure + run_callbacks :after_dispatch, :enumerator => :reverse_each + end end def flush_logger