Rodrigo Alves

Developing your JSON API in Rails with Rabl

Interchanging data is something important in many web applications. In most cases you need this to set data available to a native mobile app, or to another web application (or even many applications!). Generally you serve it all as JSON, because it’s cool to use and works fine with JavaScript and a bunch of other languages.

This post about building a simple API is only for fetching data, not persisting. And I’ll not mention REST here.

The Rabl gem let’s you easily make data available as JSON, using this gem is a real straightforward process. All you need to do is pass respond_to :json in the controller of the resource you wanna set available as JSON.

class CitiesController < ApplicationController
  respond_to :html, :json

  def index
    @cities = City.all
  end

  #...
end

Now you have to create the template that determines how the JSON objects will be displayed, the file name follows the Rails convention having the name of it’s equivalent controller action and ends in .rabl:

# index.json.rabl

collection @cities

attributes :name, :population, :flag, :climate, :area

child :city_hall do
  attributes :id, :name, :region, :location
end

child :neighborhoods do
  attributes :id, :name, :area, :population
end

child :inhabitants => :people do
  attributes :id, :name, :age, :profile_picture_url
end

child :major do
  attributes :id, :name, :mandate_start_date, :mandate_finish_date
end

Explaining what happens in this file:

Explaining it better:

When I pass :major to the child method, Rabl expects in City a has_one associaton to the Major model. Equally, Rabl expects has_many :inhabitants to be present in the City model.

The coolest stuff is that all these related data gets nested just right in the output. Neat and pretty.

Now go get it!

  $ curl -X GET http://localhost:3000/cities.json

Now you have the JSON of your dreams, totally valid, semantic and formatted.

More documentation on Rabl can be found at the gem’s README and Wiki on GitHub.

Rabl is very robust. If JSON is the problem, this gem solves it. Of course what I showed here is just a small part of what Rabl lets you do and I hope this blog post helps you out when you need to develop your own API. If you have something to add please leave it in the comments.

Rodrigo Alves is a 19 year-old hacker from Paulista, Brazil. He studies Computer Science at UFPE. Read more about him.