Hi, I'm thinking about defining Restful urls for a new project (developed with Ruby On Rails). I like the simple and clean urls of the most famous web 2.0 services like "twitter.com/username". Not talking about problems in routing configuration (I want to do that with resources not using dirty "map.connect" overrides), the very problem is: how preserve words that you want to use for your pages (such as: website.com/help, website.com/api, etc.)? I don't want to think all the possibilities at time 0 (also because it is quite impossible).
views:
278answers:
2Well, if you want to be on the safe side - think about a single prefix (map.with_options :prefix => 'do/'
) for all your custom stuff, so that all your controllers/actions will be prefixed like this
http://example.com/do/:controller/:action/:whatever
So you would just have to block the do
as username and will have the freedom to do whatever you like after that prefix.
Routes are prioritized by the moment they're declared. The first matching declared route will be the one executed.
So if you have :
map.resources :users
map.profile ':nickname', :controller => 'users', :action => 'show'
If you go to /users
, you'll be on the map.resources :users
route because that's the first one to match.
When you go to /zetarun
, you'll be routed to map.profile ':nickname', :controller => 'users', :action => 'show'
because that's the first route to match.
Then for the user profiles, you can do the following :
Define all your resources in the routes for all your controllers.
And at the end of the resources, you add the user profile resource.
So when a prefix is user by a controller, it's routed first by any route that exists.
And only the not routed url remains for user profiles.
Don't forget to add a "reserved nickname" validation on the user registration to avoid someone taking a nickname that won't give him a profile as there's something else on that url.