Nest Those Rails Resources Or Make Baby Semantic Web Cry

Proper web architecture dictates that a you should "Assign distinct URIs to distinct resources." And Cool URIs for the Semantic Web states that:

There should be no confusion between identifiers for Web documents and identifiers for other resources. URIs are meant to identify only one of them, so one URI can't stand for both a Web document and a real-world object.

So we know that a URI should refer to one and only one resource. (Of course, you may have many URIs all referring to the same resource.) So why do so many web sites have URIs like That same URI is used to refer to any account in the system, depending on who is logged in. And that makes Baby Semantic Web cry.

Why is the baby sobbing? A generic URI like isn't useful on the semantic web, because it's very difficult to make meaningful statements about that URI. Let's go and try. is the account page of "Seth Ladd".

and is the account page of "Bob Smith".

Hmm... so is the account page for both Seth and Bob? That doesn't make much sense!

A better URI for an account page would be, which is easily unique for every user.

The moral of this story is that every one of your URIs should be unique. So let's bring this all the way back to Rails and resources.

When building your resources, ask yourself, "If I GET this URI, will I see the same thing no matter who is logged in?" If the answer is "No" then you need to nest your resources so that the URI is unique and the same representation is returned no matter who you are logged in as.

For example, a typical URI would be, which could easily be a collection of books for the user. The contents of that URI are relative to the person logged in, so we have a problem. To fully qualify the URI, we need to nest books inside of the user collection. We end up with, which is unique and follows web architecture best practices. Now we can say unambiguous statements about the URI, thus populating the semantic web with more useful and meaningful triples.

Popular posts from this blog

I ported a JavaScript app to Dart. Here's what I learned.

Converting Array to List in Scala

Minification is not enough, you need tree shaking