From 2cc9c8135c57671013a0b89fd683654cb6782676 Mon Sep 17 00:00:00 2001 From: Nicholas Seckar Date: Sun, 28 Jan 2007 17:29:51 +0000 Subject: Allow Routes to generate all urls for a set of options by specifying :generate_all => true. References #1739. git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6082 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/CHANGELOG | 2 ++ actionpack/lib/action_controller/routing.rb | 9 +++++++++ actionpack/test/controller/routing_test.rb | 14 ++++++++++++++ 3 files changed, 25 insertions(+) (limited to 'actionpack') diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index a4f7e2aa93..70a4c8dbd0 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Allow Routes to generate all urls for a set of options by specifying :generate_all => true. Allows caching to properly set or expire all paths for a resource. References #1739. [Nicholas Seckar] + * Change the query parser to map empty GET params to "" rather than nil. Closes #5694. [Nicholas Seckar] * date_select and datetime_select take a :default option. #7052 [nik.wakelin] diff --git a/actionpack/lib/action_controller/routing.rb b/actionpack/lib/action_controller/routing.rb index f5faca71ca..5b888443d8 100644 --- a/actionpack/lib/action_controller/routing.rb +++ b/actionpack/lib/action_controller/routing.rb @@ -1214,6 +1214,7 @@ module ActionController def generate(options, recall = {}, method=:generate) named_route_name = options.delete(:use_route) + generate_all = options.delete(:generate_all) if named_route_name named_route = named_routes[named_route_name] options = named_route.parameter_shell.merge(options) @@ -1249,6 +1250,14 @@ module ActionController action = merged[:action] raise RoutingError, "Need controller and action!" unless controller && action + + if generate_all + # Used by caching to expire all paths for a resource + return routes.collect do |route| + route.send(method, options, merged, expire_on) + end.compact + end + # don't use the recalled keys when determining which routes to check routes = routes_by_controller[controller][action][options.keys.sort_by { |x| x.object_id }] diff --git a/actionpack/test/controller/routing_test.rb b/actionpack/test/controller/routing_test.rb index 2c59217868..0c8628fbf7 100644 --- a/actionpack/test/controller/routing_test.rb +++ b/actionpack/test/controller/routing_test.rb @@ -1719,6 +1719,20 @@ class RouteSetTest < Test::Unit::TestCase ) end + def test_generate_all + set.draw do |map| + map.connect 'show_post/:id', :controller => 'post', :action => 'show' + map.connect ':controller/:action/:id' + end + all = set.generate( + {:action => 'show', :id => 10, :generate_all => true}, + {:controller => 'post', :action => 'show'} + ) + assert_equal 2, all.length + assert_equal '/show_post/10', all.first + assert_equal '/post/show/10', all.last + end + end class RoutingTest < Test::Unit::TestCase -- cgit v1.2.3