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