Action names in RESTful URLs

A probably noob-ish question about the restful urls, but I searched the groups archives and could not find it.

IIUC, "GET /users/bob" should return a page showing information about the user identified with "bob", while "GET /users/new" returns a page with a form for creating a new user.

Ain't there an ambiguity there? Does that mean that I have to make sure that no user chooses "new" as his id?

If you retrieve them by name, yes, but usually what I've seen, especially with Rails, is retrieval by ID number. So, you'd have GET /users/23 or whatever, who may happen to be named Bob. Or if you want to get them by name, GET /users/search?name=bob, or maybe even /users/show?name=bob, or if the name isn't unique, possibly /users/index?name=bob.

-Dave

Éric Malenfant wrote:

A probably noob-ish question about the restful urls, but I searched the groups archives and could not find it.

IIUC, "GET /users/bob" should return a page showing information about the user identified with "bob", while "GET /users/new" returns a page with a form for creating a new user.

Ain't there an ambiguity there? Does that mean that I have to make sure that no user chooses "new" as his id?

If you use such "permalinks" to identify the individual resources instead of their primary key id, then you'll need to make sure you add validation to make sure the resource URI is unique. "GET /users/new" is itself a resource identifier URI. It refers to the "New Form" resource. Similarly the "Edit Form" resource has the "GET /users/edit" identifier URI.

Using the model's simple integer primary key in the resource URI eliminates this issue. I've seen some people combine the id with a textual identifier to produce URI's like "GET /users/1-bob" which would also solve this issue. "GET /users/2-new" would be distinct from "GET /users/new" so there would be no conflict. As a bonus the resource can still be easily queried by primary key by parsing "1-bob" into the integer 1, which matches the id for Bob's record.

@user = User.find("1-bob".to_i) # User.find(1)