class ActionController::Routing::RouteSet # # Example usage: # # ActionController::Routing::Routes.draw do |map| # # map.rewrite /\.(\w+)$/, '?flav=\1' # # map.rewrite { |request| # request.query_parameters.update("action"=>request.method.to_s) # } # # map.connect ':controller/:id' # # end # def rewrite(*args, &filter) if args.length == 2 pattern,replacement = *args filter = proc { |request| request.path,query = request.path.sub(pattern,replacement).split("?",2) if query request.query_parameters.update CGIMethods.parse_query_parameters(query) end } elsif !filter raise ArgumentError, "wrong number of arguments (#{a.length} for 2)" end @filters, @init_filters = [], true unless @init_filters @filters.push filter end # # Hook rewrite filters into the request recognition process # def recognize! request # replace path and query_parameters implementation for this request only path,query = request.path, request.query_parameters request.instance_eval { def path() @path end def path=(value) @path=value end def query_parameters() @query_parameters end def query_parameters=(value) @query_parameters=value end } request.path, request.query_parameters = path, query # invoke filters @filters.each {|filter| filter.call(request)} if @filters # at this point, reset all filters if any new ones are defined @init_filters = false # proceed with recognition recognize request end end