1 module ActionController
2 # Dispatches requests to the appropriate controller and takes care of
3 # reloading the app after each request when Dependencies.load? is true.
6 def define_dispatcher_callbacks(cache_classes
)
8 unless self.middleware
.include?(Reloader
)
9 self.middleware
.insert_after(Failsafe
, Reloader
)
12 ActionView
::Helpers::AssetTagHelper.cache_asset_timestamps
= false
15 if defined?(ActiveRecord
)
16 to_prepare(:activerecord_instantiate_observers) { ActiveRecord
::Base.instantiate_observers
}
19 after_dispatch
:flush_logger if Base
.logger
&& Base
.logger
.respond_to
?(:flush)
26 # DEPRECATE: Remove CGI support
27 def dispatch(cgi
= nil, session_options
= CgiRequest
::DEFAULT_SESSION_OPTIONS, output
= $stdout)
28 new(output
).dispatch_cgi(cgi
, session_options
)
31 # Add a preparation callback. Preparation callbacks are run before every
32 # request in development mode, and before the first request in production
35 # An optional identifier may be supplied for the callback. If provided,
36 # to_prepare may be called again with the same identifier to replace the
37 # existing callback. Passing an identifier is a suggested practice if the
38 # code adding a preparation block may be reloaded.
39 def to_prepare(identifier
= nil, &block
)
40 @prepare_dispatch_callbacks ||= ActiveSupport
::Callbacks::CallbackChain.new
41 callback
= ActiveSupport
::Callbacks::Callback.new(:prepare_dispatch, block
, :identifier => identifier
)
42 @prepare_dispatch_callbacks.replace_or_append
!(callback
)
45 def run_prepare_callbacks
46 if defined?(Rails
) && Rails
.logger
49 logger
= Logger
.new($stderr)
52 new(logger
).send
:run_callbacks, :prepare_dispatch
55 def reload_application
56 # Run prepare callbacks before every request in development mode
59 Routing
::Routes.reload
62 def cleanup_application
63 # Cleanup the application before processing the current request.
64 ActiveRecord
::Base.reset_subclasses
if defined?(ActiveRecord
)
65 ActiveSupport
::Dependencies.clear
66 ActiveRecord
::Base.clear_reloadable_connections
! if defined?(ActiveRecord
)
70 cattr_accessor
:middleware
71 self.middleware
= MiddlewareStack
.new
do |middleware
|
72 middlewares
= File
.join(File
.dirname(__FILE__
), "middlewares.rb")
73 middleware
.instance_eval(File
.read(middlewares
))
76 include ActiveSupport
::Callbacks
77 define_callbacks
:prepare_dispatch, :before_dispatch, :after_dispatch
79 # DEPRECATE: Remove arguments, since they are only used by CGI
80 def initialize(output
= $stdout, request
= nil, response
= nil)
82 @app = @
@middleware.build(lambda
{ |env| self.dup
._call(env) })
87 run_callbacks
:before_dispatch
88 Routing
::Routes.call(@env)
89 rescue Exception
=> exception
90 if controller
||= (::ApplicationController rescue Base
)
91 controller
.call_with_exception(@env, exception
).to_a
96 run_callbacks
:after_dispatch, :enumerator => :reverse_each
100 # DEPRECATE: Remove CGI support
101 def dispatch_cgi(cgi
, session_options
)
102 CGIHandler
.dispatch_cgi(self, cgi
, @output)