aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib
diff options
context:
space:
mode:
authorschneems <richard.schneeman@gmail.com>2012-08-01 15:33:15 -0500
committerschneems <richard.schneeman@gmail.com>2012-08-28 08:53:45 -0700
commit0b6175ac2df96ebfca1baac89c20deaa13e61142 (patch)
tree60ede308f82037c713bc516100a60798272081c5 /actionpack/lib
parentdb8ff15a497191a952e47ed8ba761f6c2cf4a1f3 (diff)
downloadrails-0b6175ac2df96ebfca1baac89c20deaa13e61142.tar.gz
rails-0b6175ac2df96ebfca1baac89c20deaa13e61142.tar.bz2
rails-0b6175ac2df96ebfca1baac89c20deaa13e61142.zip
Add Missing Keys from Journey on failed URL format
Many named routes have keys that are required to successfully resolve. If a key is left off like this: <%= link_to 'user', user_path %> This will produce an error like this: No route matches {:action=>"show", :controller=>"users"} Since we know that the :id is missing, we can add extra debugging information to the error message. No route matches {:action=>"show", :controller=>"users"} missing required keys: [:id] This will help new and seasoned developers look closer at their parameters. I've also subclassed the routing error to be clear that this error is a result of attempting to generate a url and not because the user is trying to visit a bad url. While this may sound trivial this error message is misleading and confuses most developers. The important part isn't what's in the options its's what's missing. Adding this information to the error message will make debugging much more obvious. This is the sister pull request of https://github.com/rails/journey/pull/44 which will be required to get they missing keys into the correct error message. Example Development Error in Rails: http://cl.ly/image/3S0T0n1T3421
Diffstat (limited to 'actionpack/lib')
-rw-r--r--actionpack/lib/action_controller/metal/exceptions.rb3
-rw-r--r--actionpack/lib/action_dispatch/routing/route_set.rb8
2 files changed, 7 insertions, 4 deletions
diff --git a/actionpack/lib/action_controller/metal/exceptions.rb b/actionpack/lib/action_controller/metal/exceptions.rb
index 8fd8f4797c..3c9d0c86a7 100644
--- a/actionpack/lib/action_controller/metal/exceptions.rb
+++ b/actionpack/lib/action_controller/metal/exceptions.rb
@@ -16,6 +16,9 @@ module ActionController
end
end
+ class ActionController::UrlGenerationError < RoutingError #:nodoc:
+ end
+
class MethodNotAllowed < ActionControllerError #:nodoc:
def initialize(*allowed_methods)
super("Only #{allowed_methods.to_sentence(:locale => :en)} requests are allowed.")
diff --git a/actionpack/lib/action_dispatch/routing/route_set.rb b/actionpack/lib/action_dispatch/routing/route_set.rb
index 32d267d1d6..bb1323c74e 100644
--- a/actionpack/lib/action_dispatch/routing/route_set.rb
+++ b/actionpack/lib/action_dispatch/routing/route_set.rb
@@ -534,12 +534,12 @@ module ActionDispatch
return [path, params.keys] if @extras
[path, params]
- rescue Journey::Router::RoutingError
- raise_routing_error
+ rescue Journey::Router::RoutingError => e
+ raise_routing_error(e.message)
end
- def raise_routing_error
- raise ActionController::RoutingError, "No route matches #{options.inspect}"
+ def raise_routing_error(message)
+ raise ActionController::UrlGenerationError, "No route matches #{options.inspect} #{message}"
end
def different_controller?