SinatraでのRABLの使い方

RABLとは…

  • https://github.com/nesquena/rabl
  • jsonでのレスポンスを簡単に書くためのテンプレートエンジンみたいです。
  • ちょっとしたAPIサーバーをSinatraで作るときにRABLを併用することはありそう。

インストール

source :rubygems

gem 'sinatra'
gem 'rabl'
$ bundle install

基本

class MyApp < Sinatra::Base
  Rabl.register!

  set :rabl, :format => :json

  get '/' do
    get :rabl, :home
  end
end
node(:greeting) do
  'Hello, Sinatra with RABL!'
end
$ curl http://myapp.dev
{"greeting":"Hello, Sinatra with RABL!"}

レイアウト

  • APIのレスポンスとしては、ステータスコードなどのメタ情報をすべてのレスポンスに共通して含めたい。
  • なので、Sinatraのテンプレートを使ってみる。
{
  "status": <%= response.status %>,
  "result": <%= yield %>
}
get '/' do
  render :rabl, :home, :layout_engine => :erb
end
$ curl http://myapp.dev
{
  "status": 200,
  "result": {"greeting":"Hello, Sinatra with RABL!"}
}
  • RABLのwikiにあるように、ruby 1.9.xではRABLでレイアウトを書けないので、erbを使う。
  • レスポンス本体とレイアウトのエンジンが異なる場合は、:layout_engine => :erbと指定する必要があるっぽい。