aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--railties/lib/rails/application.rb24
-rw-r--r--railties/lib/rails/engine.rb2
-rw-r--r--railties/lib/rails/routes_reloader.rb54
3 files changed, 57 insertions, 23 deletions
diff --git a/railties/lib/rails/application.rb b/railties/lib/rails/application.rb
index 2db131261c..8170be2f65 100644
--- a/railties/lib/rails/application.rb
+++ b/railties/lib/rails/application.rb
@@ -1,6 +1,7 @@
require 'active_support/core_ext/hash/reverse_merge'
require 'active_support/file_update_checker'
require 'fileutils'
+require 'rails/routes_reloader'
require 'rails/plugin'
require 'rails/engine'
@@ -81,28 +82,7 @@ module Rails
end
def routes_reloader
- @routes_reloader ||= ActiveSupport::FileUpdateChecker.new([]){ reload_routes! }
- end
-
- def reload_routes!
- routes_to_reload.each do |_routes, draw_block|
- _routes = self.routes
- _routes.disable_clear_and_finalize = true
- _routes.clear!
- _routes.draw(&draw_block) if draw_block
- end
- routes_reloader.paths.each { |path| load(path) }
- routes_to_reload.each do |_routes, draw_block|
- ActiveSupport.on_load(:action_controller) { _routes.finalize! }
- end
- ensure
- routes_to_reload.each do |_routes, draw_block|
- _routes.disable_clear_and_finalize = false
- end
- end
-
- def routes_to_reload
- @routes_to_reload ||= {}
+ @routes_reloader ||= Rails::RoutesReloader.new
end
def initialize!
diff --git a/railties/lib/rails/engine.rb b/railties/lib/rails/engine.rb
index aa82a82b19..9ae235b818 100644
--- a/railties/lib/rails/engine.rb
+++ b/railties/lib/rails/engine.rb
@@ -449,7 +449,7 @@ module Rails
end
initializer :add_routing_paths do |app|
- app.routes_to_reload[self.routes] = routes_draw_block
+ app.routes_reloader.blocks[routes] = routes_draw_block
paths.config.routes.to_a.each do |route|
app.routes_reloader.paths.unshift(route) if File.exists?(route)
end
diff --git a/railties/lib/rails/routes_reloader.rb b/railties/lib/rails/routes_reloader.rb
new file mode 100644
index 0000000000..9cfc38630d
--- /dev/null
+++ b/railties/lib/rails/routes_reloader.rb
@@ -0,0 +1,54 @@
+module Rails
+ class RoutesReloader < ::ActiveSupport::FileUpdateChecker
+ def initialize
+ super([]) { reload! }
+ end
+
+ def blocks
+ @blocks ||= {}
+ end
+ private
+ def reload!
+ clear!
+ load_blocks
+ load_paths
+ finalize!
+ ensure
+ revert
+ end
+
+ def clear!
+ routers.each do |routes|
+ routes.disable_clear_and_finalize = true
+ routes.clear!
+ end
+ end
+
+ def load_blocks
+ blocks.each do |routes, block|
+ routes.draw(&block) if block
+ end
+ end
+
+ def load_paths
+ paths.each { |path| load(path) }
+ end
+
+ def finalize!
+ routers.each do |routes|
+ ActiveSupport.on_load(:action_controller) { routes.finalize! }
+ end
+ end
+
+ def revert
+ routers.each do |routes|
+ routes.disable_clear_and_finalize = false
+ end
+ end
+
+ def routers
+ blocks.keys
+ end
+ end
+end
+