diff --git a/actionpack/lib/action_dispatch/routing/mapper.rb b/actionpack/lib/action_dispatch/routing/mapper.rb index 9c30f2a27a..53585740ce 100644 --- a/actionpack/lib/action_dispatch/routing/mapper.rb +++ b/actionpack/lib/action_dispatch/routing/mapper.rb @@ -129,7 +129,10 @@ module ActionDispatch {} end - defaults[:controller] ||= @options[:controller] || default_controller + defaults[:controller] ||= default_controller + + defaults.delete(:controller) if defaults[:controller].blank? + defaults.delete(:action) if defaults[:action].blank? if defaults[:controller].blank? && segment_keys.exclude?("controller") raise ArgumentError, "missing :controller" @@ -177,7 +180,11 @@ module ActionDispatch end def default_controller - @scope[:controller].to_s if @scope[:controller] + if @options[:controller] + @options[:controller].to_s + elsif @scope[:controller] + @scope[:controller].to_s + end end end diff --git a/actionpack/test/dispatch/routing_test.rb b/actionpack/test/dispatch/routing_test.rb index d32d708b35..8940990712 100644 --- a/actionpack/test/dispatch/routing_test.rb +++ b/actionpack/test/dispatch/routing_test.rb @@ -197,6 +197,8 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest resource :me match '/' => 'mes#index' end + + match "whatever/:controller(/:action(/:id))" end end @@ -979,6 +981,16 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest end end + def test_url_generator_for_generic_route + with_test_routes do + get 'whatever/foo/bar' + assert_equal 'foo#bar', @response.body + + assert_equal 'http://www.example.com/whatever/foo/bar/1', + url_for(:controller => "foo", :action => "bar", :id => 1) + end + end + private def with_test_routes yield