We are just upgrading our router from rails 2 to 3 and wanted to keep resource :member => {:foo => :get} working so we do not have to rewrite everything at once and can roll out the change and then refactor in a separate step.
Usage
# use this
resources :users, :member => {:invite => :post}, :collection => {:search => :get}
# instead of
resources :users, :member => {:invite => :post}, :collection => {:search => :get} do
member do
post :invite
end
collection do
get :search
end
end
Code
# keep resource with :member / :collection working to reduce diff
ActionDispatch::Routing::Mapper.class_eval do
def resources(*args, &block)
block = support_deprecated_options(args, block)
super(*args, &block)
end
def resource(*args, &block)
block = support_deprecated_options(args, block)
super(*args, &block)
end
private
def support_deprecated_options(args, original_block)
options = args.last
if options.is_a?(Hash) && (options[:member] || options[:collection])
collection = options.delete(:collection)
member = options.delete(:member)
Proc.new do
collection { add_deprecated_actions(collection) } if collection
member { add_deprecated_actions(member) } if member
original_block.call if original_block
end
else
original_block
end
end
def add_deprecated_actions(collection)
collection.each { |name, method| match name, :via => (method == :any ? nil : method) }
end
end