From 2d06782bcb5fbbb3f93c949e89a8350225f2665f Mon Sep 17 00:00:00 2001 From: Andrew White Date: Tue, 24 Aug 2010 07:27:54 +0100 Subject: [PATCH] When custom resource actions are specified using strings add the default name and action if the string is a valid ruby method name. [#5431 state:resolved] --- actionpack/lib/action_dispatch/routing/mapper.rb | 8 ++++++-- actionpack/test/dispatch/routing_test.rb | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/actionpack/lib/action_dispatch/routing/mapper.rb b/actionpack/lib/action_dispatch/routing/mapper.rb index 23b13d1..0a6cd63 100644 --- a/actionpack/lib/action_dispatch/routing/mapper.rb +++ b/actionpack/lib/action_dispatch/routing/mapper.rb @@ -736,8 +736,12 @@ module ActionDispatch end elsif resource_method_scope? path = path_for_custom_action - options[:action] ||= action - options[:as] = name_for_action(options[:as]) if options[:as] + if action =~ /^[a-zA-Z][_a-zA-Z0-9]*$/ + options[:action] ||= action + options[:as] = name_for_action(action, options[:as]) + else + options[:as] = name_for_action(options[:as]) if options[:as] + end args.push(options) with_exclusive_scope do diff --git a/actionpack/test/dispatch/routing_test.rb b/actionpack/test/dispatch/routing_test.rb index c529db4..f4a839e 100644 --- a/actionpack/test/dispatch/routing_test.rb +++ b/actionpack/test/dispatch/routing_test.rb @@ -212,11 +212,15 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest get "overdue", :to => :overdue, :on => :collection get "print" => "invoices#print", :as => :print, :on => :member post "preview" => "invoices#preview", :as => :preview, :on => :new + get "aged/:months", :on => :collection, :action => :aged, :as => :aged end resources :notes, :shallow => true do get "preview" => "notes#preview", :as => :preview, :on => :new get "print" => "notes#print", :as => :print, :on => :member end + get "inactive", :on => :collection + post "deactivate", :on => :member + get "old", :on => :collection, :as => :stale end namespace :api do @@ -2034,6 +2038,24 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest verify_redirect 'http://www.example.com/countries/all/cities' end + def test_custom_resource_actions_defined_using_string + get '/customers/inactive' + assert_equal 'customers#inactive', @response.body + assert_equal '/customers/inactive', inactive_customers_path + + post '/customers/1/deactivate' + assert_equal 'customers#deactivate', @response.body + assert_equal '/customers/1/deactivate', deactivate_customer_path(:id => '1') + + get '/customers/old' + assert_equal 'customers#old', @response.body + assert_equal '/customers/old', stale_customers_path + + get '/customers/1/invoices/aged/3' + assert_equal 'invoices#aged', @response.body + assert_equal '/customers/1/invoices/aged/3', aged_customer_invoices_path(:customer_id => '1', :months => '3') + end + private def with_test_routes yield -- 1.7.1