From 203b88f99848454680ce5554b1cb38b6f4dee11b Mon Sep 17 00:00:00 2001
From: kennyj <kennyj@gmail.com>
Date: Fri, 10 Feb 2012 21:20:55 +0900
Subject: Fix GH #4720. Routing problem with nested namespace and already
 camelized controller option.

---
 .../lib/action_dispatch/routing/route_set.rb       |  5 +++++
 actionpack/test/dispatch/routing_test.rb           | 26 ++++++++++++++++++++++
 2 files changed, 31 insertions(+)

diff --git a/actionpack/lib/action_dispatch/routing/route_set.rb b/actionpack/lib/action_dispatch/routing/route_set.rb
index 8e3975e369..6c189fdba6 100644
--- a/actionpack/lib/action_dispatch/routing/route_set.rb
+++ b/actionpack/lib/action_dispatch/routing/route_set.rb
@@ -31,6 +31,7 @@ module ActionDispatch
         end
 
         def prepare_params!(params)
+          normalize_controller!(params)
           merge_default_action!(params)
           split_glob_param!(params) if @glob_param
         end
@@ -66,6 +67,10 @@ module ActionDispatch
           controller.action(action).call(env)
         end
 
+        def normalize_controller!(params)
+          params[:controller] = params[:controller].underscore if params.key?(:controller)
+        end
+
         def merge_default_action!(params)
           params[:action] ||= 'index'
         end
diff --git a/actionpack/test/dispatch/routing_test.rb b/actionpack/test/dispatch/routing_test.rb
index 1216193075..518d0333eb 100644
--- a/actionpack/test/dispatch/routing_test.rb
+++ b/actionpack/test/dispatch/routing_test.rb
@@ -2449,6 +2449,32 @@ class TestAppendingRoutes < ActionDispatch::IntegrationTest
   end
 end
 
+class TestNamespaceWithControllerOption < ActionDispatch::IntegrationTest
+  module ::Admin
+    class StorageFilesController < ActionController::Base
+      def index
+        render :text => "admin/storage_files#index"
+      end
+    end
+  end
+
+  DefaultScopeRoutes = ActionDispatch::Routing::RouteSet.new
+  DefaultScopeRoutes.draw do
+    namespace :admin do
+      resources :storage_files, :controller => "StorageFiles"
+    end
+  end
+
+  def app
+    DefaultScopeRoutes
+  end
+
+  def test_controller_options
+    get '/admin/storage_files'
+    assert_equal "admin/storage_files#index", @response.body
+  end
+end
+
 class TestDefaultScope < ActionDispatch::IntegrationTest
   module ::Blog
     class PostsController < ActionController::Base
-- 
cgit v1.2.3