vendor/rails/actionpack/lib/action_controller/dispatcher.rb in radiant-0.8.0 vs vendor/rails/actionpack/lib/action_controller/dispatcher.rb in radiant-0.8.1

- old
+ new

@@ -1,16 +1,15 @@ module ActionController # Dispatches requests to the appropriate controller and takes care of # reloading the app after each request when Dependencies.load? is true. class Dispatcher + @@cache_classes = true + class << self def define_dispatcher_callbacks(cache_classes) + @@cache_classes = cache_classes unless cache_classes - unless self.middleware.include?(Reloader) - self.middleware.insert_after(Failsafe, Reloader) - end - ActionView::Helpers::AssetTagHelper.cache_asset_timestamps = false end if defined?(ActiveRecord) to_prepare(:activerecord_instantiate_observers) { ActiveRecord::Base.instantiate_observers } @@ -77,11 +76,11 @@ define_callbacks :prepare_dispatch, :before_dispatch, :after_dispatch # DEPRECATE: Remove arguments, since they are only used by CGI def initialize(output = $stdout, request = nil, response = nil) @output = output - @app = @@middleware.build(lambda { |env| self.dup._call(env) }) + build_middleware_stack if @@cache_classes end def dispatch begin run_callbacks :before_dispatch @@ -101,18 +100,34 @@ def dispatch_cgi(cgi, session_options) CGIHandler.dispatch_cgi(self, cgi, @output) end def call(env) - @app.call(env) + if @@cache_classes + @app.call(env) + else + Reloader.run do + # When class reloading is turned on, we will want to rebuild the + # middleware stack every time we process a request. If we don't + # rebuild the middleware stack, then the stack may contain references + # to old classes metal classes, which will b0rk class reloading. + build_middleware_stack + @app.call(env) + end + end end def _call(env) @env = env dispatch end def flush_logger Base.logger.flush end + + private + def build_middleware_stack + @app = @@middleware.build(lambda { |env| self.dup._call(env) }) + end end end