diff options
author | Andrew White <andyw@pixeltrix.co.uk> | 2013-01-15 17:18:59 +0000 |
---|---|---|
committer | Andrew White <andyw@pixeltrix.co.uk> | 2013-01-15 17:22:25 +0000 |
commit | f1d8f2af72e21d41efd02488f1c2dcf829e17783 (patch) | |
tree | 00250bda5b8af7a81d16c621972e56b07191b18b /actionpack/lib/action_dispatch/routing | |
parent | 90d2802b71a6e89aedfe40564a37bd35f777e541 (diff) | |
download | rails-f1d8f2af72e21d41efd02488f1c2dcf829e17783.tar.gz rails-f1d8f2af72e21d41efd02488f1c2dcf829e17783.tar.bz2 rails-f1d8f2af72e21d41efd02488f1c2dcf829e17783.zip |
Change the behavior of route defaults
This commit changes route defaults so that explicit defaults are no
longer required where the key is not part of the path. For example:
resources :posts, bucket_type: 'posts'
will be required whenever constructing the url from a hash such as a
functional test or using url_for directly. However using the explicit
form alters the behavior so it's not required:
resources :projects, defaults: { bucket_type: 'projects' }
This changes existing behavior slightly in that any routes which
only differ in their defaults will match the first route rather
than the closest match.
Closes #8814
Diffstat (limited to 'actionpack/lib/action_dispatch/routing')
-rw-r--r-- | actionpack/lib/action_dispatch/routing/mapper.rb | 9 | ||||
-rw-r--r-- | actionpack/lib/action_dispatch/routing/route_set.rb | 2 |
2 files changed, 9 insertions, 2 deletions
diff --git a/actionpack/lib/action_dispatch/routing/mapper.rb b/actionpack/lib/action_dispatch/routing/mapper.rb index 43d87e9c0b..6d93f609a6 100644 --- a/actionpack/lib/action_dispatch/routing/mapper.rb +++ b/actionpack/lib/action_dispatch/routing/mapper.rb @@ -61,8 +61,8 @@ module ActionDispatch normalize_path! normalize_options! normalize_requirements! - normalize_defaults! normalize_conditions! + normalize_defaults! end def to_route @@ -186,6 +186,13 @@ module ActionDispatch @conditions[key] = condition end + @conditions[:required_defaults] = [] + options.each do |key, required_default| + next if segment_keys.include?(key) || IGNORE_OPTIONS.include?(key) + next if Regexp === required_default + @conditions[:required_defaults] << key + end + via_all = options.delete(:via) if options[:via] == :all if !via_all && options[:via].blank? diff --git a/actionpack/lib/action_dispatch/routing/route_set.rb b/actionpack/lib/action_dispatch/routing/route_set.rb index 931ad372a8..c72310cca3 100644 --- a/actionpack/lib/action_dispatch/routing/route_set.rb +++ b/actionpack/lib/action_dispatch/routing/route_set.rb @@ -421,7 +421,7 @@ module ActionDispatch end conditions.keep_if do |k, _| - k == :action || k == :controller || + k == :action || k == :controller || k == :required_defaults || @request_class.public_method_defined?(k) || path_values.include?(k) end end |