overriding std nested resources route

I have a set of nested resources as follows:

    map.resources :users
  map.resources :users, :has_many => :contacts

this gives me a std route as follows to list a user's contacts in the
ContactsController 'index' action:

        /users/<user id>/contacts

A User has a 'username' and what I'd like to do is have the route/url
look like:


Does anyone know how to do this? I've tried using map.connect, but
that doesnt seem to work.

btw - I also tried

        map.resources :users, :path_prefix => "/:username"

but that still leaves the url as:


I'm trying to get rid of the '/users' in the front.


If you want the route to be www.mysite.com/bill-walton you will have
to create a catch-all and ofcourse that needs to go at the bottom of
your routes...

Something like so:

map.username ':username', :controller => 'users', :action => 'show'

But now you will have to do a good amount of security in the users
controller. All hackers will hit that controller if it does not match
any other routes.. I guess you could add a regular expression but that
means your usernames would have to follow something that can be

thx... I had tried named routes, but something must not have been
right... now I got it working as follows:

  map.contacts '/:username/contacts', :controller =>
'contacts', :action => 'index'

this gives me what I wanted. if I use:


I get:


That works for that one restful route, but I had hoped to be able to
do something with the nested resource declaration and have this apply
for all the routes... for instance I still have urls that look like

        /users/<user id>/contacts/<contact id>

when I'd like to see:

        /<username>/contacts/<contact id>

anybody know how to get this form for all the generated restful