Question

I have a Rails app implementing a game, so it's expected that a player will leave a browser open at the game page. When player Alan takes an action himself, I use AJAX requests to update the game page Alan is viewing to reflect the new state. However, when another player (Bob) takes an action, I don't have (or want) a mechanism to push the change to Alan's view.

I would like Alan's page to periodically poll the Rails server to find if there have been any changes since last reload, and to reload the page (either via a whole-page GET or an AJAX call) if not. In order to play nicely with caches and proxies, I'd like to do this by issuing a periodic HTTP HEAD request, get Rails to work out the timestamp of the last change (trivially available from my DB) and respond with that in the Last-Modified header; then have the client-side act on that timestamp.

How can I go about doing this?

Was it helpful?

Solution

A lot of what you want is built-in to Rails.

Have a look at Conditional GETS in the Rails cache guide.

If you set this up right it all just happens between the browser and the server.

If you are very keen, you can put a reverse proxy in front of your Rails stack and have a whole extra layer of caching.

OTHER TIPS

I don't have (or want) a mechanism to push the change to Alan's view.

Why don't you want realtime updates to the other players view?

You could achieve this with long polling AJAX requests like ajaxmessaging does (did?) or if Flash is your weapon of choice then Juggernaut could be an option. The nginx_http_push_module also looks really promising. It's fair to say that the whole deal is kind of a mess so let's hope for a surprisingly quick move to HTML5 and its WebSockets.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top