From 33841a9db3e560ef062d36d14ea07f7d71dd65ab Mon Sep 17 00:00:00 2001
From: Yves Senn <yves.senn@gmail.com>
Date: Wed, 2 Jan 2013 21:11:16 +0100
Subject: Backport #8701, do not append a second slash with `trailing_slash:
 true`

---
 actionpack/CHANGELOG.md                    | 13 +++++++++++++
 actionpack/lib/action_dispatch/http/url.rb |  6 +++++-
 actionpack/test/controller/routing_test.rb | 20 +++++++++++++++-----
 3 files changed, 33 insertions(+), 6 deletions(-)

(limited to 'actionpack')

diff --git a/actionpack/CHANGELOG.md b/actionpack/CHANGELOG.md
index 0748b1dc86..2de084cfd6 100644
--- a/actionpack/CHANGELOG.md
+++ b/actionpack/CHANGELOG.md
@@ -1,5 +1,18 @@
 ## Rails 3.2.11 (unreleased) ##
 
+*   Do not append second slash to root_url when using `trailing_slash: true`
+    Fix #8700.
+    Backport #8701.
+
+    Example:
+        # before
+        root_url # => http://test.host//
+
+        # after
+        root_url # => http://test.host/
+
+    *Yves Senn*
+
 *   Fix a bug in `content_tag_for` that prevents it for work without a block.
 
     *Jasl*
diff --git a/actionpack/lib/action_dispatch/http/url.rb b/actionpack/lib/action_dispatch/http/url.rb
index 64459836b5..f07d5adc9b 100644
--- a/actionpack/lib/action_dispatch/http/url.rb
+++ b/actionpack/lib/action_dispatch/http/url.rb
@@ -43,7 +43,11 @@ module ActionDispatch
           params = options[:params] || {}
           params.reject! {|k,v| v.to_param.nil? }
 
-          rewritten_url << (options[:trailing_slash] ? path.sub(/\?|\z/) { "/" + $& } : path)
+          if options[:trailing_slash] && !path.ends_with?('/')
+            rewritten_url << path.sub(/(\?|\z)/) { "/" + $& }
+          else
+            rewritten_url << path
+          end
           rewritten_url << "?#{params.to_query}" unless params.empty?
           rewritten_url << "##{Journey::Router::Utils.escape_fragment(options[:anchor].to_param.to_s)}" if options[:anchor]
           rewritten_url
diff --git a/actionpack/test/controller/routing_test.rb b/actionpack/test/controller/routing_test.rb
index 7079a6ff90..becb928a3c 100644
--- a/actionpack/test/controller/routing_test.rb
+++ b/actionpack/test/controller/routing_test.rb
@@ -58,13 +58,13 @@ class UriReservedCharactersRoutingTest < Test::Unit::TestCase
 end
 
 class MockController
-  def self.build(helpers)
+  def self.build(helpers, additional_options = {})
     Class.new do
-      def url_for(options)
+      define_method :url_for do |options|
         options[:protocol] ||= "http"
         options[:host] ||= "test.host"
 
-        super(options)
+        super(options.merge(additional_options))
       end
 
       include helpers
@@ -468,8 +468,8 @@ class LegacyRouteSetTests < Test::Unit::TestCase
     routes.send(:pages_url)
   end
 
-  def setup_for_named_route
-    MockController.build(rs.url_helpers).new
+  def setup_for_named_route(options = {})
+    MockController.build(rs.url_helpers, options).new
   end
 
   def test_named_route_without_hash
@@ -487,6 +487,16 @@ class LegacyRouteSetTests < Test::Unit::TestCase
     assert_equal("/", routes.send(:root_path))
   end
 
+  def test_named_route_root_with_trailing_slash
+    rs.draw do
+      root :to => "hello#index"
+    end
+
+    routes = setup_for_named_route(trailing_slash: true)
+    assert_equal("http://test.host/", routes.send(:root_url))
+    assert_equal("http://test.host/?foo=bar", routes.send(:root_url, foo: :bar))
+  end
+
   def test_named_route_with_regexps
     rs.draw do
       match 'page/:year/:month/:day/:title' => 'page#show', :as => 'article',
-- 
cgit v1.2.3