recursive Rails style serialization for javascript objects
Suffer no longer. With the following code you can serialize arbitrarily nested objects (eg, the sort of thing you get when you parse a JSON statement), so that it is ready to be posted via http to a Rails app.
The original Rails recursive Javascript object serializer.
var serializer = { serialize : function(object) { var values = []; var prefix = ''; values = this.recursive_serialize(object, values, prefix); param_string = values.join('&'); return param_string; }, recursive_serialize : function(object, values, prefix) { for (key in object) { if (typeof object[key] == 'object') { if (prefix.length > 0) { prefix += '['+key+']'; } else { prefix += key; } values = this.recursive_serialize(object[key], values, prefix); prefixes = prefix.split('['); if (prefixes.length > 1) { prefix = prefixes.slice(0,prefixes.length-1).join('['); } else { prefix = prefixes[0]; } } else { value = encodeURIComponent(object[key]); if (prefix.length > 0) { prefixed_key = prefix+'['+key+']' } else { prefixed_key = key } prefixed_key = encodeURIComponent(prefixed_key); if (value) values.push(prefixed_key + '=' + value); } } return values; } }
Usage:
payload = new Object; payload.comment = new Object; payload.comment.title = "The Title"; payload.comment.body = "The body of the post."; post_string = serializer.serialize(payload);
Result:
comment%5Btitle%5D=The%20Title&comment%5Bbody%5D=The%20body%20of%20the%20post.
Which gives you this in Rails:
params[:comment] #=> {:title => "The Title", :body => "The body of the post."}