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:

        /<username>/contacts

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:

      /users/<username>/contacts

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

Hi,

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 regexed...

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:

        contacts_url(@user.username):

I get:

        /<username>/contacts

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 this:

        /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 routes?