Today I've been mostly unwell. Although I have managed to write some minor new code, and watch a little bit of Doctor Who on DVD.
Recently several people have been ranting about Ruby on Rails. I like it, but I wouldn't use it for personal development in a hurry. Deployment is fiddly, and upgrades are annoying.
But one thing that I utterly condemn Rails for is helping to spread bad paging throughout the online world.
So, what is "bad paging" and why is it important? Well cool URLs don't change, right? "Bad paging" is any user-interface which presents you with a limited view upon a changing list of items which is non-bookmarkable.
Consider the following "list". Assume it represents your view of a collection of items numbering 100+. You may only view ten items at a time; clicking "next", or "previous", to navigate your viewport:
1. first item 2. second item .. 10. tenth item [see next: /start/1] [see prev]
Whats wrong with this picture? It is subtle, but this list is broken. The issue is that when the list grows new items are prepended to the front, yet the navigation is linked to the starting page number.
If that description wasn't clear consider what happens if you want to bookmark the page containing item 11. How can you?
Right now it is at /start/1. If a ten new items are appended to the head of the list then it will instead become /start/2 - as items that are currently numbered 1-10 will be shifted forward to become items 11-20, and and they will be on page /start/1 instead.
The solution is simple enough once you consider what you want to happen:
- Either append items to the end of the list.
- Such that /start/1 always gives the items 11-20.
- Number the links in the reverse order.
So why does nobody do that? (As a counter example look at my website: Rather than the 'Show previous' items linking you to the changing link /start/1, it instead links you to /start/569 (for example).
Tags: paging, random, rants 2 comments
What you really want: sort the items by some field (such as "name"), then say "give me the items starting at name=foo".