
jbuilderでjsonを生成するときのメモ
最近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なので、//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
してみて、//localhost:3000/api/sample_postにアクセスして、次のようなjsonが出力されていたらOK。
{
"post": {
"title": "foo",
"body": "bar"
}
}
余談だけど、今回いずれリリースされるであろうRails5を入れてみた。で、インストール直後の画面がすごく可愛かったので記念スクショ。これってbetaとかrc1は前からこうだったのかな?
Railsもそろそろ本を読んでサンプルを大量に書いてみたい。