Skip to content
This repository
Browse code

Make sure the optimisation code for routes doesn't get used if :host,…

… :anchor or :port are provided in the hash arguments. [pager, Koz] Closes #10292

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8227 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
commit 6a611e1e95ceec43473d2310678bfd6156899b7a 1 parent 45d679b
Michael Koziarski authored November 28, 2007
2  actionpack/CHANGELOG
... ...
@@ -1,5 +1,7 @@
1 1
 *SVN*
2 2
 
  3
+* Make sure the optimisation code for routes doesn't get used if :host, :anchor or :port are provided in the hash arguments. [pager, Koz] #10292
  4
+
3 5
 * Added protection from trailing slashes on page caching #10229 [devrieda]
4 6
 
5 7
 * Asset timestamps are appended, not prepended. Closes #10276 [mnaberez]
2  actionpack/lib/action_controller/routing_optimisation.rb
@@ -97,7 +97,7 @@ def generation_code
97 97
       # argument
98 98
       class PositionalArgumentsWithAdditionalParams < PositionalArguments
99 99
         def guard_condition
100  
-          "defined?(request) && request && args.size == #{route.segment_keys.size + 1}"
  100
+          "defined?(request) && request && args.size == #{route.segment_keys.size + 1} && !args.last.has_key?(:anchor) && !args.last.has_key?(:port) && !args.last.has_key?(:host)"
101 101
         end
102 102
 
103 103
         # This case uses almost the Use the same code as positional arguments, 
50  actionpack/test/controller/routing_test.rb
@@ -218,13 +218,12 @@ def test_optimised_named_route_call_never_uses_url_for
218 218
       x.send(:user_path, 3, :bar=>"foo")
219 219
     end
220 220
     
221  
-    def test_optimized_named_route_with_host 
  221
+    def test_optimised_named_route_with_host 
222 222
      	rs.add_named_route :pages, 'pages', :controller => 'content', :action => 'show_page', :host => 'foo.com' 
223 223
      	x = setup_for_named_route 
224 224
      	x.expects(:url_for).with(:host => 'foo.com', :only_path => false, :controller => 'content', :action => 'show_page', :use_route => :pages).once
225 225
       x.send(:pages_url)
226  
-    end
227  
-    
  226
+    end  
228 227
   end
229 228
 
230 229
   def setup_for_named_route
@@ -936,8 +935,16 @@ def initialize(routes)
936 935
 
937 936
     def url_for(options)
938 937
       only_path = options.delete(:only_path)
  938
+      
  939
+      port        = options.delete(:port) || 80
  940
+      port_string = port == 80 ? '' : ":#{port}"
  941
+      
  942
+      host   = options.delete(:host) || "named.route.test"
  943
+      anchor = "##{options.delete(:anchor)}" if options.key?(:anchor)
  944
+      
939 945
       path = routes.generate(options)
940  
-      only_path ? path : "http://named.route.test#{path}"
  946
+      
  947
+      only_path ? "#{path}#{anchor}" : "http://#{host}#{port_string}#{path}#{anchor}"
941 948
     end
942 949
     
943 950
     def request
@@ -1553,7 +1560,40 @@ def test_named_route_url_method
1553 1560
     assert_equal '/admin/users', set.generate(controller.send(:hash_for_users_url), {:controller => 'users', :action => 'index'})
1554 1561
   end
1555 1562
 
1556  
-  def test_namd_route_url_method_with_ordered_parameters
  1563
+  def test_named_route_url_method_with_anchor
  1564
+    controller = setup_named_route_test
  1565
+
  1566
+    assert_equal "http://named.route.test/people/5#location", controller.send(:show_url, :id => 5, :anchor => 'location')
  1567
+    assert_equal "/people/5#location", controller.send(:show_path, :id => 5, :anchor => 'location')
  1568
+
  1569
+    assert_equal "http://named.route.test/people#location", controller.send(:index_url, :anchor => 'location')
  1570
+    assert_equal "/people#location", controller.send(:index_path, :anchor => 'location')
  1571
+
  1572
+    assert_equal "http://named.route.test/admin/users#location", controller.send(:users_url, :anchor => 'location')
  1573
+    assert_equal '/admin/users#location', controller.send(:users_path, :anchor => 'location')
  1574
+
  1575
+    assert_equal "http://named.route.test/people/go/7/hello/joe/5#location",
  1576
+      controller.send(:multi_url, 7, "hello", 5, :anchor => 'location')
  1577
+
  1578
+    assert_equal "http://named.route.test/people/go/7/hello/joe/5?baz=bar#location",
  1579
+      controller.send(:multi_url, 7, "hello", 5, :baz => "bar", :anchor => 'location')
  1580
+
  1581
+    assert_equal "http://named.route.test/people?baz=bar#location",
  1582
+      controller.send(:index_url, :baz => "bar", :anchor => 'location')
  1583
+  end
  1584
+  
  1585
+  def test_named_route_url_method_with_port
  1586
+    controller = setup_named_route_test
  1587
+    assert_equal "http://named.route.test:8080/people/5", controller.send(:show_url, 5, :port=>8080)
  1588
+  end
  1589
+  
  1590
+  def test_named_route_url_method_with_host
  1591
+    controller = setup_named_route_test
  1592
+    assert_equal "http://some.example.com/people/5", controller.send(:show_url, 5, :host=>"some.example.com")
  1593
+  end
  1594
+  
  1595
+
  1596
+  def test_named_route_url_method_with_ordered_parameters
1557 1597
     controller = setup_named_route_test
1558 1598
     assert_equal "http://named.route.test/people/go/7/hello/joe/5",
1559 1599
       controller.send(:multi_url, 7, "hello", 5)

0 notes on commit 6a611e1

Please sign in to comment.
Something went wrong with that request. Please try again.