最近Swiftを勉強していて、ちょっと自前でAPiサーバーを作らないといけなくなった。

その時にGrapeとかgemを使ったサンプルはたくさん見つかるが、ピュアRails(Rails5から入るAPIオプションも使わない)からjbuilder使う方法がサクっと見つからなかったので、Rails+jbuilderでjsonを生成するメモ。

ruby
2.3.0
rails
5.0.0.rc1

まずは適当なモデルを作成する。

$ rails g model SamplePost title:string body:text
$ rails db:migration

次にroutesを設定する。apiなので、http://example.com/api/v1/postというようにapiというnamespaceを与え、更にバージョニングできるようにし……と、よく見る説明やパターンだけど、バージョンとかってapi/v1/って事はv2作るときってすっごいコピペが発生して、それってなんかRuby/Railsっぽいくないなぁ。

これ、もしもAPIを公開する事があったとして、あえて古いバージョンのAPIを残すというのなら、urlパラメーターぐらいにしておいが方が良くない?と、思ってググるとヒットした。

今回は/v1/というurlは作らず、シンプルに作成する事にした。というわけでroutes.rbを編集。

# config/routes.rb
Rails.application.routes.draw do
  namespace :api do
    namespace :sample_post do
      get '/', action: 'index'
    end
  end
end

そして、controllerを書く。この時、viewのindex.json.jbuilderを使う方法が分からなかったけど、handlersでjbuilderを設定すれば良いみたい。

# app/controllers/api/sample_post_controller.rb
class Api::SamplePostController < ApplicationController
  def index
    @sample_post = SamplePost.first
    render 'index', formats: 'json', handlers: 'jbuilder'
  end
end

最後にviewsにindex.json.jbuilderを作成する。

# app/views/api/sample_post/index.json.jbuilder
json.post do |json|
  json.title @sample_post.title
  json.body @sample_post.body
end

これでひとまず出力はできるようになっているはず。rails sしてみて、http://localhost:3000/api/sample_postにアクセスして、次のようなjsonが出力されていたらOK。

{
  "post": {
    "title": "foo",
    "body": "bar"
  }
}

余談だけど、今回いずれリリースされるであろうRails5を入れてみた。で、インストール直後の画面がすごく可愛かったので記念スクショ。これってbetaとかrc1は前からこうだったのかな?

Railsもそろそろ本を読んでサンプルを大量に書いてみたい。