aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_dispatch/journey/route.rb
diff options
context:
space:
mode:
authorAndrew White <andyw@pixeltrix.co.uk>2013-07-16 13:27:22 +0100
committerAndrew White <andyw@pixeltrix.co.uk>2013-07-16 13:39:17 +0100
commit1555a1800ea550a991eb57ce1ec8236bdba0365a (patch)
tree06bcffbd8a656373ffd57713fabec8a00ab7ba1c /actionpack/lib/action_dispatch/journey/route.rb
parentc238a6cc7ce69f200db72c4cb3c67bd47cea7d7c (diff)
downloadrails-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.rb12
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)