diff options
author | Aaron Patterson <tenderlove@github.com> | 2018-09-26 14:21:15 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-26 14:21:15 -0700 |
commit | 7f870a5ba2aa9177aa4a0e03a9d027928ba60e49 (patch) | |
tree | b4fb19def15c5033483ecebe25d4e762ee1a4dab /actionpack/lib/action_dispatch/testing/assertions | |
parent | 6556898884d636c59baae008e42783b8d3e16440 (diff) | |
parent | b42d246c5d020a46d5964d236eb7f0d857ef01e8 (diff) | |
download | rails-7f870a5ba2aa9177aa4a0e03a9d027928ba60e49.tar.gz rails-7f870a5ba2aa9177aa4a0e03a9d027928ba60e49.tar.bz2 rails-7f870a5ba2aa9177aa4a0e03a9d027928ba60e49.zip |
Merge pull request #33970 from rails/eager-url-helpers
Eagerly build the routing helper module after routes are committed
Diffstat (limited to 'actionpack/lib/action_dispatch/testing/assertions')
-rw-r--r-- | actionpack/lib/action_dispatch/testing/assertions/routing.rb | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/actionpack/lib/action_dispatch/testing/assertions/routing.rb b/actionpack/lib/action_dispatch/testing/assertions/routing.rb index af41521c5c..0e8712f8d9 100644 --- a/actionpack/lib/action_dispatch/testing/assertions/routing.rb +++ b/actionpack/lib/action_dispatch/testing/assertions/routing.rb @@ -138,6 +138,20 @@ module ActionDispatch assert_generates(path.is_a?(Hash) ? path[:path] : path, generate_options, defaults, extras, message) end + # Provides a hook on `finalize!` so we can mutate a controller after the + # route set has been drawn. + class WithRouting < ActionDispatch::Routing::RouteSet # :nodoc: + def initialize(&block) + super() + @block = block + end + + def finalize! + super + @block.call self + end + end + # A helper to make it easier to test different route configurations. # This method temporarily replaces @routes with a new RouteSet instance. # @@ -152,16 +166,19 @@ module ActionDispatch # end # def with_routing - old_routes, @routes = @routes, ActionDispatch::Routing::RouteSet.new - if defined?(@controller) && @controller - old_controller, @controller = @controller, @controller.clone - _routes = @routes - - @controller.singleton_class.include(_routes.url_helpers) - - if @controller.respond_to? :view_context_class - @controller.view_context_class = Class.new(@controller.view_context_class) do - include _routes.url_helpers + old_routes = @routes + old_controller = nil + @routes = WithRouting.new do |_routes| + if defined?(@controller) && @controller + old_controller, @controller = @controller, @controller.clone + _routes = @routes + + @controller.singleton_class.include(_routes.url_helpers) + + if @controller.respond_to? :view_context_class + @controller.view_context_class = Class.new(@controller.view_context_class) do + include _routes.url_helpers + end end end end |