aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--actionpack/lib/action_dispatch/routing/mapper.rb20
-rw-r--r--actionpack/test/dispatch/routing_test.rb20
2 files changed, 39 insertions, 1 deletions
diff --git a/actionpack/lib/action_dispatch/routing/mapper.rb b/actionpack/lib/action_dispatch/routing/mapper.rb
index 278cf383ee..cc3ed169d8 100644
--- a/actionpack/lib/action_dispatch/routing/mapper.rb
+++ b/actionpack/lib/action_dispatch/routing/mapper.rb
@@ -32,6 +32,8 @@ module ActionDispatch
end
class Mapping
+ IGNORE_OPTIONS = [:to, :as, :controller, :action, :via, :on, :constraints, :defaults, :only, :except, :anchor]
+
def initialize(set, scope, args)
@set, @scope = set, scope
@path, @options = extract_path_and_options(args)
@@ -96,7 +98,15 @@ module ActionDispatch
end
def defaults
- @defaults ||= if to.respond_to?(:call)
+ @defaults ||= (@options[:defaults] || {}).tap do |defaults|
+ defaults.merge!(default_controller_and_action)
+ defaults.reverse_merge!(@scope[:defaults]) if @scope[:defaults]
+ @options.each { |k, v| defaults[k] = v unless v.is_a?(Regexp) || IGNORE_OPTIONS.include?(k.to_sym) }
+ end
+ end
+
+ def default_controller_and_action
+ if to.respond_to?(:call)
{ }
else
defaults = case to
@@ -299,6 +309,10 @@ module ActionDispatch
scope(:constraints => constraints) { yield }
end
+ def defaults(defaults = {})
+ scope(:defaults => defaults) { yield }
+ end
+
def match(*args)
options = args.extract_options!
@@ -343,6 +357,10 @@ module ActionDispatch
merge_options_scope(parent, child)
end
+ def merge_defaults_scope(parent, child)
+ merge_options_scope(parent, child)
+ end
+
def merge_blocks_scope(parent, child)
(parent || []) + [child]
end
diff --git a/actionpack/test/dispatch/routing_test.rb b/actionpack/test/dispatch/routing_test.rb
index 87a46feec7..cbe9b5488c 100644
--- a/actionpack/test/dispatch/routing_test.rb
+++ b/actionpack/test/dispatch/routing_test.rb
@@ -121,6 +121,13 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest
# misc
match 'articles/:year/:month/:day/:title', :to => "articles#show", :as => :article
+ # default params
+ match 'inline_pages/(:id)', :to => 'pages#show', :id => 'home'
+ match 'default_pages/(:id)', :to => 'pages#show', :defaults => { :id => 'home' }
+ defaults :id => 'home' do
+ match 'scoped_pages/(:id)', :to => 'pages#show'
+ end
+
namespace :account do
match 'shorthand'
match 'description', :to => "account#description", :as => "description"
@@ -769,6 +776,19 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest
end
end
+ def test_default_params
+ with_test_routes do
+ get '/inline_pages'
+ assert_equal 'home', @request.params[:id]
+
+ get '/default_pages'
+ assert_equal 'home', @request.params[:id]
+
+ get '/scoped_pages'
+ assert_equal 'home', @request.params[:id]
+ end
+ end
+
private
def with_test_routes
yield