diff options
author | Andrew White <andyw@pixeltrix.co.uk> | 2013-07-16 13:27:22 +0100 |
---|---|---|
committer | Andrew White <andyw@pixeltrix.co.uk> | 2013-07-16 13:39:17 +0100 |
commit | 1555a1800ea550a991eb57ce1ec8236bdba0365a (patch) | |
tree | 06bcffbd8a656373ffd57713fabec8a00ab7ba1c /actionpack/lib/action_dispatch/journey/route.rb | |
parent | c238a6cc7ce69f200db72c4cb3c67bd47cea7d7c (diff) | |
download | rails-1555a1800ea550a991eb57ce1ec8236bdba0365a.tar.gz rails-1555a1800ea550a991eb57ce1ec8236bdba0365a.tar.bz2 rails-1555a1800ea550a991eb57ce1ec8236bdba0365a.zip |
Skip Rack applications and redirects when generating urls
When generating an unnamed url (i.e. using `url_for` with an options
hash) we should skip anything other than standard Rails routes otherwise
it will match the first mounted application or redirect and generate a
url with query parameters rather than raising an error if the options
hash doesn't match any defined routes.
Fixes #8018
Diffstat (limited to 'actionpack/lib/action_dispatch/journey/route.rb')
-rw-r--r-- | actionpack/lib/action_dispatch/journey/route.rb | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/actionpack/lib/action_dispatch/journey/route.rb b/actionpack/lib/action_dispatch/journey/route.rb index 50e1853094..c8eb0f6f2d 100644 --- a/actionpack/lib/action_dispatch/journey/route.rb +++ b/actionpack/lib/action_dispatch/journey/route.rb @@ -16,6 +16,14 @@ module ActionDispatch @app = app @path = path + # Unwrap any constraints so we can see what's inside for route generation. + # This allows the formatter to skip over any mounted applications or redirects + # that shouldn't be matched when using a url_for without a route name. + while app.is_a?(Routing::Mapper::Constraints) do + app = app.app + end + @dispatcher = app.is_a?(Routing::RouteSet::Dispatcher) + @constraints = constraints @defaults = defaults @required_defaults = nil @@ -93,6 +101,10 @@ module ActionDispatch end end + def dispatcher? + @dispatcher + end + def matches?(request) constraints.all? do |method, value| next true unless request.respond_to?(method) |