Friday, March 5, 2010

Ruby Dates to Javascript the Easy Way

Whilst writing the queue management for Cafebop in Javascript using the excellent JQTouch library I came across a problem that I thought would be trivial to solve. In the end it was trivial but maybe it's so trivial that nobody ever mentions it so I couldn't find any info on it.

Basically, I wanted to instantiate a Javascript Date object from a Ruby Date object via a JSON call. The problem is that Javascript's Date object constructor can't parse the default string output by Ruby's Date#to_s.

However, it can parse an integer which is milliseconds since the Unix epoch. Ruby's Date#to_i outputs the number of seconds since the unix epoch. So, using my mad arithmetic skillz, I figured I can create a Javascript Date with:

new Date(rubyGeneratedInteger * 1000);

So my usage of it went something like this. In my rails model, I generate an appropriate integer representation of the timestamp:

class Order < ActiveRecord::Base
def queued_at_utc
queued_at.to_i
end
# ...
end
view raw order.rb hosted with ❤ by GitHub


I make that available to a JSON client through the controller:
class QueuedOrdersController < ApplicationController
def show
respond_to do |format|
format.json {
render :json=>@order.to_json(
:methods=>[:queued_at_utc]
# ...
)
}
end
end
end

And consume it from the Javascript client thus:
Date.fromSecondsSinceEpoch = function(seconds) {
return new Date(seconds * 1000);
};
// JSON call to retrieve queued order (using JQuery)
$.ajax({
type: 'GET',
success: handleQueuedOrder,
url: 'http://localhost:3000/queued_orders/1',
dataType: 'json'
});
function handleQueuedOrder(data) {
var order = data['queued_order'];
var queued_at = Date.fromSecondsSinceEpoch(order.queued_at_utc);
alert('Order queued at: ' + queued_at);
}
view raw mobile.js hosted with ❤ by GitHub

No comments: