Daniel Vartanov
2009-Oct-14 11:50 UTC
Sophisticated routes recognition (with regexp, for instance). Is there any way?
Hi! Let''s imagine we need to deal with such non-RESTful routes: /!some_value # note the ''!'' in the beginning /resource(value) == The first obvious way to do it in Rails is: map.first_example ''/%21:value'', :controller => .... map.second_example ''/resource%28:value%29'' (%21 is ''!'', %28 and %29 are ''('' and '')'' respectively) This won''t work: ActionController::RoutingError (No route matches "/resource%28foo%29" with {:method=>:get}): == Another approach is to use :requirements map.first_example ''/:value'', :controller => ''first, :action => ''index'', :requirements => { :value => /%21(\w+)/ } but it will route to controller with: Parameters: {"value"=>"!foo"} and I will need to parse it again in the action! second example is even more ugly: map.second_example '':value'', :controller => ''second'', :action => ''index'', :requirements => { :predicate => /resource%28(.*)%29/ } You see? I have to match this route entirely in :requirements and I still have: Parameters: {"value"=>"resource(foo)"} in controller and have to parse it again. == Questions: 1) Is there any alternative router for Rails and can I replace native router with it? 2) Is there common way to do so: ActionController::Routing::Routes.draw do |map| ....... # regular routes map.any_other_route '':query_string'', :controller => ''additional_router'', :action => ''parse_route'' # this action can raise RoutingError if there is no matches even in ''sophisticated'' routes map end