From 3a48b83e5eec62a5d2bfab1a118c24b45345388c Mon Sep 17 00:00:00 2001 From: Andrew White Date: Sun, 5 Jan 2014 19:58:04 +0000 Subject: [PATCH] Allow an absolute controller path inside a module scope Fixes #12777 --- actionpack/CHANGELOG.md | 4 ++++ actionpack/lib/action_dispatch/routing/mapper.rb | 8 ++++++-- actionpack/test/dispatch/routing_test.rb | 12 ++++++++++++ guides/source/routing.md | 2 ++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/actionpack/CHANGELOG.md b/actionpack/CHANGELOG.md index bf608e162b..944bf18113 100644 --- a/actionpack/CHANGELOG.md +++ b/actionpack/CHANGELOG.md @@ -1,3 +1,7 @@ +* Allow an absolute controller path inside a module scope + + Fixes #12777 + * Unique the segment keys array for non-optimized url helpers In Rails 3.2 you only needed pass an argument for dynamic segment once so diff --git a/actionpack/lib/action_dispatch/routing/mapper.rb b/actionpack/lib/action_dispatch/routing/mapper.rb index 4bf2dc6e23..18f37dc732 100644 --- a/actionpack/lib/action_dispatch/routing/mapper.rb +++ b/actionpack/lib/action_dispatch/routing/mapper.rb @@ -218,8 +218,12 @@ def default_controller_and_action controller ||= default_controller action ||= default_action - unless controller.is_a?(Regexp) - controller = [@scope[:module], controller].compact.join("/").presence + if @scope[:module] && !controller.is_a?(Regexp) + if controller =~ %r{\A/} + controller = controller[1..-1] + else + controller = [@scope[:module], controller].compact.join("/").presence + end end if controller.is_a?(String) && controller =~ %r{\A/} diff --git a/actionpack/test/dispatch/routing_test.rb b/actionpack/test/dispatch/routing_test.rb index 840c157642..5a532dc38f 100644 --- a/actionpack/test/dispatch/routing_test.rb +++ b/actionpack/test/dispatch/routing_test.rb @@ -2882,6 +2882,18 @@ def test_multiple_positional_args_with_the_same_name assert_equal '/downloads/1/1.tar', download_path('1', '1') end + def test_absolute_controller_namespace + draw do + namespace :foo do + get '/', to: '/bar#index', as: 'root' + end + end + + get '/foo' + assert_equal 'bar#index', @response.body + assert_equal '/foo', foo_root_path + end + private def draw(&block) diff --git a/guides/source/routing.md b/guides/source/routing.md index 3375293b5a..70d4722068 100644 --- a/guides/source/routing.md +++ b/guides/source/routing.md @@ -239,6 +239,8 @@ In each of these cases, the named routes remain the same as if you did not use ` | PATCH/PUT | /admin/posts/:id | posts#update | post_path(:id) | | DELETE | /admin/posts/:id | posts#destroy | post_path(:id) | +TIP: _If you need to use a different controller namespace inside a `namespace` block you can specify an absolute controller path, e.g: `get '/foo' => '/foo#index'`._ + ### Nested Resources It's common to have resources that are logically children of other resources. For example, suppose your application includes these models: -- GitLab