Make any Ruby object Rack-friendly with Rackable
François Vaux has recently published a Ruby module called Rackable which allows you to make any Ruby object Rack-friendly, providing it with a REST-like interface.
What does this mean? Well, a Rack application is essentially a Ruby object that responds to call()
. Rackable just gives your object a call method which uses the Rack environment to dispatch to a method.
So, you just need to include Rackable in your class and implement methods for the the appropriate REST verbs. This means you can create a hello_world.ru file like this:
require 'rackable' class HelloWorld include Rackable def get() "Hello, world!" end end run HelloWorld.new
... start it with rackup, and then use something like curl (or even your browser) to call the methods.
Thanks to Alex Young for putting me on to this.
Also.. Got a slow Test::Unit or RSpec suite? Run them up to three times faster on Devver's cloud! Setup is simple and requires no code changes. Request a beta invite today!
July 21, 2009 at 4:08 am
Interesting. But why not just use Sinatra?
July 21, 2009 at 1:55 pm
Ah beat me to it but I've actually been working on something similar recently. It takes the idea a bit further though, with support for content negotiation, caching, conditional requests, auth, subresource resolution, range requests and some other goodies. Hoping to develop it into something of a framework for restful API development.
Just put it up on github now: http://github.com/mjwillson/rest_on_rack/tree/master
Although the rdoc might be a better place to start (Rack::REST::Resource and Rack::REST::Entity being the most important things to look at)
http://dev.playlouder.com/doc/rest_on_rack/rdoc/
Still a work in progress but a lot is already in place and tested, interested to hear from anyone interested in helping out / potentially using something like this, it's born somewhat out of frustration at doing pure API work in rails/merb.
July 22, 2009 at 1:35 pm
So, we can put this directly in our AR models and skip the views then right? ;)