From 2d26176de318320a4d2b6df40b3ea9aaf03380eb Mon Sep 17 00:00:00 2001 From: Andrew White Date: Mon, 28 Jun 2010 12:04:13 +0100 Subject: [PATCH] Merge :constraints from scope into resource options --- actionpack/lib/action_dispatch/routing/mapper.rb | 2 + actionpack/test/dispatch/routing_test.rb | 43 ++++++++++++++++++++++ 2 files changed, 45 insertions(+), 0 deletions(-) diff --git a/actionpack/lib/action_dispatch/routing/mapper.rb b/actionpack/lib/action_dispatch/routing/mapper.rb index 388f695..47a48b4 100644 --- a/actionpack/lib/action_dispatch/routing/mapper.rb +++ b/actionpack/lib/action_dispatch/routing/mapper.rb @@ -592,6 +592,7 @@ module ActionDispatch def resource(*resources, &block) options = resources.extract_options! options = (@scope[:options] || {}).merge(options) + options[:constraints] = @scope[:constraints].merge(options[:constraints] || {}) if @scope[:constraints].is_a?(Hash) options[:shallow] = true if @scope[:shallow] && !options.has_key?(:shallow) if apply_common_behavior_for(:resource, resources, options, &block) @@ -620,6 +621,7 @@ module ActionDispatch def resources(*resources, &block) options = resources.extract_options! options = (@scope[:options] || {}).merge(options) + options[:constraints] = @scope[:constraints].merge(options[:constraints] || {}) if @scope[:constraints].is_a?(Hash) options[:shallow] = true if @scope[:shallow] && !options.has_key?(:shallow) if apply_common_behavior_for(:resources, resources, options, &block) diff --git a/actionpack/test/dispatch/routing_test.rb b/actionpack/test/dispatch/routing_test.rb index 0548456..b5653a3 100644 --- a/actionpack/test/dispatch/routing_test.rb +++ b/actionpack/test/dispatch/routing_test.rb @@ -334,6 +334,13 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest get '/tickets', :to => 'tickets#index', :as => :tickets end + scope :constraints => { :id => /\d{4}/ } do + resources :movies do + resources :reviews + resource :trailer + end + end + match '/:locale/*file.:format', :to => 'files#show', :file => /path\/to\/existing\/file/ end end @@ -1558,6 +1565,42 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest end end + def test_constraints_are_merged_from_scope + with_test_routes do + get '/movies/0001' + assert_equal 'movies#show', @response.body + assert_equal '/movies/0001', movie_path(:id => '0001') + + get '/movies/00001' + assert_equal 'Not Found', @response.body + assert_raises(ActionController::RoutingError){ movie_path(:id => '00001') } + + get '/movies/0001/reviews' + assert_equal 'reviews#index', @response.body + assert_equal '/movies/0001/reviews', movie_reviews_path(:movie_id => '0001') + + get '/movies/00001/reviews' + assert_equal 'Not Found', @response.body + assert_raises(ActionController::RoutingError){ movie_reviews_path(:movie_id => '00001') } + + get '/movies/0001/reviews/0001' + assert_equal 'reviews#show', @response.body + assert_equal '/movies/0001/reviews/0001', movie_review_path(:movie_id => '0001', :id => '0001') + + get '/movies/00001/reviews/0001' + assert_equal 'Not Found', @response.body + assert_raises(ActionController::RoutingError){ movie_path(:movie_id => '00001', :id => '00001') } + + get '/movies/0001/trailer' + assert_equal 'trailers#show', @response.body + assert_equal '/movies/0001/trailer', movie_trailer_path(:movie_id => '0001') + + get '/movies/00001/trailer' + assert_equal 'Not Found', @response.body + assert_raises(ActionController::RoutingError){ movie_trailer_path(:movie_id => '00001') } + end + end + private def with_test_routes yield -- 1.7.1