From 7bdd5b768e51f74fa437d1cc8f3c36643364c4fe Mon Sep 17 00:00:00 2001
From: Brennan Dunn <me@brennandunn.com>
Date: Thu, 28 Aug 2008 07:35:00 -0400
Subject: Accept an array of method symbols for collection/member actions of
 resources

Signed-off-by: Jeremy Kemper <jeremy@bitsweat.net>
---
 actionpack/lib/action_controller/resources.rb | 21 +++++++++++++--------
 actionpack/test/controller/resources_test.rb  | 13 +++++++++++++
 2 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/actionpack/lib/action_controller/resources.rb b/actionpack/lib/action_controller/resources.rb
index 5f579cdb11..b4ac0db262 100644
--- a/actionpack/lib/action_controller/resources.rb
+++ b/actionpack/lib/action_controller/resources.rb
@@ -238,8 +238,9 @@ module ActionController
     #
     # The +resources+ method accepts the following options to customize the resulting routes:
     # * <tt>:collection</tt> - Add named routes for other actions that operate on the collection.
-    #   Takes a hash of <tt>#{action} => #{method}</tt>, where method is <tt>:get</tt>/<tt>:post</tt>/<tt>:put</tt>/<tt>:delete</tt>
-    #   or <tt>:any</tt> if the method does not matter.  These routes map to a URL like /messages/rss, with a route of +rss_messages_url+.
+    #   Takes a hash of <tt>#{action} => #{method}</tt>, where method is <tt>:get</tt>/<tt>:post</tt>/<tt>:put</tt>/<tt>:delete</tt>,
+    #   an array of any of the previous, or <tt>:any</tt> if the method does not matter.
+    #   These routes map to a URL like /messages/rss, with a route of +rss_messages_url+.
     # * <tt>:member</tt> - Same as <tt>:collection</tt>, but for actions that operate on a specific member.
     # * <tt>:new</tt> - Same as <tt>:collection</tt>, but for actions that operate on the new resource action.
     # * <tt>:controller</tt> - Specify the controller name for the routes.
@@ -480,8 +481,10 @@ module ActionController
       def map_collection_actions(map, resource)
         resource.collection_methods.each do |method, actions|
           actions.each do |action|
-            action_options = action_options_for(action, resource, method)
-            map_named_routes(map, "#{action}_#{resource.name_prefix}#{resource.plural}", "#{resource.path}#{resource.action_separator}#{action}", action_options)
+            [method].flatten.each do |m|
+              action_options = action_options_for(action, resource, m)
+              map_named_routes(map, "#{action}_#{resource.name_prefix}#{resource.plural}", "#{resource.path}#{resource.action_separator}#{action}", action_options)
+            end
           end
         end
       end
@@ -521,12 +524,14 @@ module ActionController
       def map_member_actions(map, resource)
         resource.member_methods.each do |method, actions|
           actions.each do |action|
-            action_options = action_options_for(action, resource, method)
+            [method].flatten.each do |m|
+              action_options = action_options_for(action, resource, m)
 
-            action_path = resource.options[:path_names][action] if resource.options[:path_names].is_a?(Hash)
-            action_path ||= Base.resources_path_names[action] || action
+              action_path = resource.options[:path_names][action] if resource.options[:path_names].is_a?(Hash)
+              action_path ||= Base.resources_path_names[action] || action
 
-            map_named_routes(map, "#{action}_#{resource.name_prefix}#{resource.singular}", "#{resource.member_path}#{resource.action_separator}#{action_path}", action_options)
+              map_named_routes(map, "#{action}_#{resource.name_prefix}#{resource.singular}", "#{resource.member_path}#{resource.action_separator}#{action_path}", action_options)
+            end
           end
         end
 
diff --git a/actionpack/test/controller/resources_test.rb b/actionpack/test/controller/resources_test.rb
index e153b0cc98..7830767723 100644
--- a/actionpack/test/controller/resources_test.rb
+++ b/actionpack/test/controller/resources_test.rb
@@ -264,6 +264,19 @@ class ResourcesTest < Test::Unit::TestCase
     end
   end
 
+  def test_array_as_collection_or_member_method_value
+    with_restful_routing :messages, :collection => { :search => [:get, :post] }, :member => { :toggle => [:get, :post] } do
+      assert_restful_routes_for :messages do |options|
+        [:get, :post].each do |method|
+          assert_recognizes(options.merge(:action => 'search'), :path => "/messages/search", :method => method)
+        end
+        [:get, :post].each do |method|
+          assert_recognizes(options.merge(:action => 'toggle', :id => '1'), :path => '/messages/1/toggle', :method => method)
+        end
+      end
+    end
+  end
+
   def test_with_new_action
     with_restful_routing :messages, :new => { :preview => :post } do
       preview_options = {:action => 'preview'}
-- 
cgit v1.2.3