aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--actionpack/lib/action_dispatch/routing/route_set.rb19
-rw-r--r--actionpack/test/routing/helper_test.rb2
2 files changed, 18 insertions, 3 deletions
diff --git a/actionpack/lib/action_dispatch/routing/route_set.rb b/actionpack/lib/action_dispatch/routing/route_set.rb
index 3ae9f92c0b..fca663b2a3 100644
--- a/actionpack/lib/action_dispatch/routing/route_set.rb
+++ b/actionpack/lib/action_dispatch/routing/route_set.rb
@@ -184,12 +184,27 @@ module ActionDispatch
def optimized_helper(args)
path = @string_route.dup
klass = Journey::Router::Utils
+ parameterized_args = args.map(&:to_param)
+ missing_keys = []
- @path_parts.zip(args) do |part, arg|
+ parameterized_args.each_with_index do |arg, index|
+ if arg.nil? || arg.empty?
+ missing_keys << @path_parts[index]
+ end
+ end
+
+ unless missing_keys.empty?
+ message = "No route matches #{Hash[@path_parts.zip(args)].inspect}"
+ message << " missing required keys: #{missing_keys.inspect}"
+
+ raise ActionController::UrlGenerationError, message
+ end
+
+ @path_parts.zip(parameterized_args) do |part, arg|
# Replace each route parameter
# e.g. :id for regular parameter or *path for globbing
# with ruby string interpolation code
- path.gsub!(/(\*|:)#{part}/, klass.escape_fragment(arg.to_param))
+ path.gsub!(/(\*|:)#{part}/, klass.escape_fragment(arg))
end
path
end
diff --git a/actionpack/test/routing/helper_test.rb b/actionpack/test/routing/helper_test.rb
index a5588d95fa..0028aaa629 100644
--- a/actionpack/test/routing/helper_test.rb
+++ b/actionpack/test/routing/helper_test.rb
@@ -22,7 +22,7 @@ module ActionDispatch
x = Class.new {
include rs.url_helpers
}
- assert_raises ActionController::RoutingError do
+ assert_raises ActionController::UrlGenerationError do
x.new.pond_duck_path Duck.new
end
end