diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 2da874782d0920586d4c573d9df8044d99459122..c3a771e6d2dca5078a8d545eebd106c1c6656e3e 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Add ability to specify Route Regexps for controllers. Closes #1917. [Sebastian Kanthak] + * Provide Named Route's hash methods as helper methods. Closes #1744. [Nicholas Seckar, Steve Purcell] * Added :multipart option to ActiveRecordHelper#form to make it possible to add file input fields #2034 [jstirk@oobleyboo.com] diff --git a/actionpack/lib/action_controller/routing.rb b/actionpack/lib/action_controller/routing.rb index f06a464adbbe4629dd03a711142d8fd3ca909029..c6cd8df6b4cc03218e5fe5ed181888a014156224 100644 --- a/actionpack/lib/action_controller/routing.rb +++ b/actionpack/lib/action_controller/routing.rb @@ -192,7 +192,14 @@ def recognition_check(g) g << "controller_result = ::ActionController::Routing::ControllerComponent.traverse_to_controller(#{g.path_name}, #{g.index_name})" g.if('controller_result') do |gp| gp << 'controller_value, segments_to_controller = controller_result' - gp.move_forward('segments_to_controller') {|gpp| yield gpp, :constraint} + if condition + gp << "controller_path = #{gp.path_name}[#{gp.index_name},segments_to_controller].join('/')" + gp.if(Routing.test_condition("controller_path", condition)) do |gpp| + gpp.move_forward('segments_to_controller') {|gppp| yield gppp, :constraint} + end + else + gp.move_forward('segments_to_controller') {|gpp| yield gpp, :constraint} + end end end diff --git a/actionpack/test/controller/routing_test.rb b/actionpack/test/controller/routing_test.rb index cc8b50390be3d555121e0cc1ea0aebe093c642cf..0da376f51940ab41dcbf797674b8bdb0b1653384 100644 --- a/actionpack/test/controller/routing_test.rb +++ b/actionpack/test/controller/routing_test.rb @@ -238,6 +238,20 @@ def test_controller assert_equal({:controller => ::Controllers::Admin::UserController, :action => 'hi'}, execute('hi/admin/user')) end + def test_controller_with_regexp + c = [Static.new("hi"), Controller.new(:controller, :condition => /^admin\/.+$/)] + g.constant_result :action, "hi" + + go c + + assert_nil execute('hi') + assert_nil execute('hi/x') + assert_nil execute('hi/content') + assert_equal({:controller => ::Controllers::Admin::UserController, :action => 'hi'}, execute('hi/admin/user')) + assert_equal({:controller => ::Controllers::Admin::NewsFeedController, :action => 'hi'}, execute('hi/admin/news_feed')) + assert_nil execute('hi/admin/user/foo') + end + def test_standard_route(time = ::RunTimeTests) c = [Controller.new(:controller), Dynamic.new(:action, :default => 'index'), Dynamic.new(:id, :default => nil)] go c @@ -407,6 +421,17 @@ def test_controller assert_equal '/hi/admin/user', execute({}, {:controller => 'admin/user'}) end + def test_controller_with_regexp + c = [Static.new("hi"), Controller.new(:controller, :condition => /^admin\/.+$/)] + go c + + assert_nil execute({}, {}) + assert_nil execute({:controller => 'content'}, {}) + assert_equal '/hi/admin/user', execute({:controller => 'admin/user'}, {}) + assert_nil execute({}, {:controller => 'content'}) + assert_equal '/hi/admin/user', execute({}, {:controller => 'admin/user'}) + end + def test_standard_route(time = ::RunTimeTests) c = [Controller.new(:controller), Dynamic.new(:action, :default => 'index'), Dynamic.new(:id, :default => nil)] go c @@ -635,6 +660,19 @@ def test_route_generating_string_literal_in_comparison_warning $stderr = old_stderr end + def test_route_with_regexp_for_controller + rs.draw do |map| + map.connect ':controller/:admintoken/:action/:id', :controller => /admin\/.+/ + map.connect ':controller/:action/:id' + end + assert_equal({:controller => ::Controllers::Admin::UserController, :admintoken => "foo", :action => "index"}.stringify_keys, + rs.recognize_path(%w(admin user foo))) + assert_equal({:controller => ::Controllers::ContentController, :action => "foo"}.stringify_keys, + rs.recognize_path(%w(content foo))) + assert_equal ['/admin/user/foo', []], rs.generate(:controller => "admin/user", :admintoken => "foo", :action => "index") + assert_equal ['/content/foo',[]], rs.generate(:controller => "content", :action => "foo") + end + def test_basic_named_route rs.home '', :controller => 'content', :action => 'list' x = setup_for_named_route