Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Show full route constraints in error message

When an optimized helper fails to generate, show the full route constraints
in the error message. Previously it would only show the contraints that were
required as part of the path.

Fixes #13592
  • Loading branch information...
commit 892c539591c001285792b7865fe5d70846b0041b 1 parent b9efc74
@pixeltrix pixeltrix authored
View
10 actionpack/CHANGELOG.md
@@ -1,3 +1,13 @@
+* Show full route constraints in error message
+
+ When an optimized helper fails to generate, show the full route constraints
+ in the error message. Previously it would only show the contraints that were
+ required as part of the path.
+
+ Fixes #13592
+
+ *Andrew White*
+
* Use a custom route visitor for optimized url generation. Fixes #13349.
*Andrew White*
View
4 actionpack/lib/action_dispatch/journey/formatter.rb
@@ -33,8 +33,8 @@ def generate(type, name, options, recall = {}, parameterize = nil)
return [route.format(parameterized_parts), params]
end
- message = "No route matches #{constraints.inspect}"
- message << " missing required keys: #{missing_keys.inspect}" if name
+ message = "No route matches #{Hash[constraints.sort].inspect}"
+ message << " missing required keys: #{missing_keys.sort.inspect}" if name
raise ActionController::UrlGenerationError, message
end
View
5 actionpack/lib/action_dispatch/routing/route_set.rb
@@ -210,8 +210,9 @@ def missing_keys(args)
end
def raise_generation_error(args, missing_keys)
- message = "No route matches #{args.inspect}"
- message << " missing required keys: #{missing_keys.inspect}"
+ constraints = Hash[@route.requirements.merge(args).sort]
+ message = "No route matches #{constraints.inspect}"
+ message << " missing required keys: #{missing_keys.sort.inspect}"
raise ActionController::UrlGenerationError, message
end
View
25 actionpack/test/dispatch/routing_test.rb
@@ -3708,3 +3708,28 @@ def test_redirect_doesnt_match_unnamed_route
end
end
end
+
+class TestUrlGenerationErrors < ActionDispatch::IntegrationTest
+ Routes = ActionDispatch::Routing::RouteSet.new.tap do |app|
+ app.draw do
+ get "/products/:id" => 'products#show', :as => :product
+ end
+ end
+
+ def app; Routes end
+
+ include Routes.url_helpers
+
+ test "url helpers raise a helpful error message whem generation fails" do
+ url, missing = { action: 'show', controller: 'products', id: nil }, [:id]
+ message = "No route matches #{url.inspect} missing required keys: #{missing.inspect}"
+
+ # Optimized url helper
+ error = assert_raises(ActionController::UrlGenerationError){ product_path(nil) }
+ assert_equal message, error.message
+
+ # Non-optimized url helper
+ error = assert_raises(ActionController::UrlGenerationError, message){ product_path(id: nil) }
+ assert_equal message, error.message
+ end
+end
Please sign in to comment.
Something went wrong with that request. Please try again.