Browse Source

Fix prefix = false in connect()

Connecting routes with a prefix = false created an un-matchable route.
Ignore falsey prefix values when setting up prefixes.

Fixes #2479
mark_story 14 years ago
parent
commit
c81fe6249d
2 changed files with 26 additions and 2 deletions
  1. 5 1
      lib/Cake/Routing/Router.php
  2. 21 1
      lib/Cake/Test/Case/Routing/RouterTest.php

+ 5 - 1
lib/Cake/Routing/Router.php

@@ -233,7 +233,11 @@ class Router {
 	public static function connect($route, $defaults = array(), $options = array()) {
 		foreach (self::$_prefixes as $prefix) {
 			if (isset($defaults[$prefix])) {
-				$defaults['prefix'] = $prefix;
+				if ($defaults[$prefix]) {
+					$defaults['prefix'] = $prefix;
+				} else {
+					unset($defaults[$prefix]);
+				}
 				break;
 			}
 		}

+ 21 - 1
lib/Cake/Test/Case/Routing/RouterTest.php

@@ -1699,6 +1699,27 @@ class RouterTest extends CakeTestCase {
 	}
 
 /**
+ * Test that setting a prefix to false is ignored, as its generally user error.
+ *
+ * @return void
+ */
+	public function testPrefixFalseIgnored() {
+		Configure::write('Routing.prefixes', array('admin'));
+		Router::connect('/cache_css/*', array('admin' => false, 'controller' => 'asset_compress', 'action' => 'get'));
+
+		$url = Router::url(array('controller' => 'asset_compress', 'action' => 'get', 'test'));
+		$expected = '/cache_css/test';
+		$this->assertEquals($expected, $url);
+
+		$url = Router::url(array('admin' => false, 'controller' => 'asset_compress', 'action' => 'get', 'test'));
+		$expected = '/cache_css/test';
+		$this->assertEquals($expected, $url);
+
+		$url = Router::url(array('admin' => true, 'controller' => 'asset_compress', 'action' => 'get', 'test'));
+		$this->assertEquals('/admin/asset_compress/get/test', $url);
+	}
+
+/**
  * testRemoveBase method
  *
  * @return void
@@ -2474,5 +2495,4 @@ class RouterTest extends CakeTestCase {
 		Router::parse('/not-a-match');
 		$this->assertEquals(Router::$routes[0]->response->header(), array());
 	}
-
 }