I’ve been playing around more with Red. I alternate between really liking it and totally pulling my hair out. On a order form app that I’m building I made some very quick work of a dynamically updating billing summary div. It came together very quickly until I added the AJAX piece. AJAX support in Red is actually very good, but JSON support is non-existent. This made Ryan a sad boy. I dug around to see what other people have done and found that they haven’t done much. There is some stub code for a Request::JSON that my be what I’m looking for at some point, but I need it now. So here is what I did:
[sourcecode language=‘ruby’]
class Module
def define_method(sym, &block)
`this.prototype[‘m$’+sym.value=block.block.unbound`
`Red.updateChildren(this)`
`Red.updateIncluders(this)`
return `block`
end
end
class Object
def self.from_json(text)
ret = Object.new
meths = []
`var v = eval(“(”#{text}.value“)”)`
`for(var member in v){#{meths}.push(new Array($q(member), $q(v[member])))}`
meths.each do |meth|
ret.class.send(:define_method, meth0) do
meth1
end
end
return ret
end
end
[/sourcecode]
Now doing a simple AJAX call that returns JSON becomes really easy:
[sourcecode language=‘ruby’]
@req = Request.new(:url => ‘/orders’)
@req.upon(:response) do |response|
new_data = Object.from_json(response.text)
@summary = new_data.summary
@subtotal = new_data.subtotal
@total = new_data.total
end
@req.execute(:data => {’plan_id’ => @plan, ‘promo’ => @promo})
[/sourcecode]
A few things to note here. The section that defines `define_method` on `Module` is actually back ported from the current master branch of Red. This works pretty well, though I haven’t tried it with a JSON string that describes a living object. But I don’t think it’s too far from being able to handle that.