module PowerTools module ActionController # Pilfered from Bruce Williams' (http://codefluency.com) plugin which now seems to be unavailable. module ParamTypes def self.included(base) base.instance_eval do @@param_type_handlers = {} cattr_accessor :param_type_handlers prepend_before_filter :convert_param_types end base.extend(ClassInstanceMethods) end module ClassInstanceMethods def add_param_type(name,&block) self.param_type_handlers[name.kind_of?(Regexp) ? name : name.to_s] = block end def handler_for_param_type(param_type) self.param_type_handlers.each do |criteria,handler| if param_type == criteria || (criteria.kind_of?(Regexp) && criteria.match(param_type)) return handler end end return false end end def convert_param_types(object=params) if object.kind_of?(Hash) extra_params = {} object.each do |key,value| if match = /^(.+)\((.+)\)$/.match(key.to_s) new_key, param_type = match.captures if handler = ::ActionController::Base.handler_for_param_type(param_type) this_value = convert_param_types(object.delete(key)) # If there's already a key by the same name in this hash (without a type) # whose value is an array add its values before calling the handler this_value = if this_value.kind_of?(Array) && object[new_key].kind_of?(Array) this_value + object[new_key] else this_value end case handler.arity when 1 object[new_key] = handler.call(this_value) when 3 handler.call(extra_params, new_key, this_value) end end else object[key] = convert_param_types(value) end end object.update(extra_params) end object end end end end