【Rails】Jbuilderのメソッドについて調べてみた
業務でJbuilderに出会って、Jbuilderって何?ってなったので
調べてみました。
Jbuilderとは、JSON作成を簡単にするものです。
RailsはJbuilderを備えています。
今回はJbuilderがどのようにJSONを生成するのかについてまとめます。
その前にさらっとJSONについても触れたいと思います。
JSON
JSONは以下のようなデータ形式で表現されます。
1 2 3 4 5 6 7 |
{ "key" : value, "key" : value, "key" : value } |
以下はサンプルです。
1 2 3 4 5 6 7 8 9 10 |
{ "user" : { "name" : "Taro", "email" : "taro@example.com" "age" : 20, "active" : true } } |
JSONはkeyとvalueのペアであるメンバーを複数持ちます。
keyは”(ダブルクォート)で囲む必要があります。
valueは下記の型を使用することができます。
・文字列("...")
・数値(12,12.3など)
・ヌル値(null)
・真偽値(true,false)
・オブジェクト({...})
・配列([...])
インスタンス変数を使わないjbuilderの書き方
RailsのJbuilderを使うと、簡単にJSONを生成することができます。
以下のように記述すると、簡単なキーとバリューを返すことができます。
1 2 3 4 5 |
json.text ''テキスト" # {"text" : "テキスト"} |
set!メソッドを使っても、簡単なキーとバリューを返すことができます。
1 2 3 4 5 |
json.set! :text, "テキスト" # {"text" : "テキスト"} |
複数のキーとバリューを返したい時は以下のように書きます。
1 2 3 4 5 6 |
json.text1 "テキスト1" json.text2 "テキスト2" # {"text1" : "テキスト1", "text2" : "テキスト2"} |
set!メソッド
set!メソッドを使うと、簡単なキーとバリューを返すことができます。
1 2 3 4 5 |
json.set! :text, "テキスト # {"text" : "テキスト"} |
他にも属性をまとめることができます。
1 2 3 4 5 6 7 |
json.set! :tweet do json.text "テキスト" end # {"tweet": {"text" : "テキスト"}} |
textではなく、set!を使うことで以下のようにも書けます。
1 2 3 4 5 6 7 |
json.set! :tweet do json.set! :text, "テキスト" end # {"tweet" : {"text" : "テキスト"}} |
属性をまとめて、複数の値を返すこともできます。
1 2 3 4 5 6 7 8 9 10 11 |
json.set! :tweet1 do json.set! :text1, "テキスト1" end json.set! :tweet2 do json.set! :text2, "テキスト2" end #{"tweet1" : {"text1" : "テキスト2"}, {"tweet2" : {"text2" : "テキスト2"}}} |
キーが被ると合成された値になります。
1 2 3 4 5 6 7 8 9 10 11 |
json.set! :tweet do json.set! :text1, "テキスト1" end json.set! :tweet do json.set! :text2, "テキスト2" end # {"tweet" :{"text1" : "テキスト1, "text2" : "テキスト2"}} |
インスタンス変数を使うJbuilderの書き方
ユーザーが投稿できるサービスを前提とします。
テーブル構造は、user : post = 1 : 多の関係になっています。
テーブル名はそれぞれusers、postsです。
postsテーブルには、id、title、text、user_idの4つのカラムがあります。
インスタンス変数の中身が1つのとき
コントローラーでは単数のインスタンス変数を定義しています。
1 2 3 4 5 6 7 |
class PostsController < ApplicationController def show @post = Post.find(params[:id]) end end |
特定の値を返す場合は以下のように書きます。
1 2 3 4 5 |
json.text @post.text # {"text" : "テキスト"} |
複数の値を返す場合は、以下のように書きます。
1 2 3 4 5 6 |
json.text @post.title json.text @post.text # {"title" : "タイトル", "text" : "テキスト"} |
特定のキーでまとめて返す場合は以下のように書きます。
1 2 3 4 5 |
json.post @post, :title, :text # {"post" : {"title" : "タイトル", "text" : "テキスト"}} |
以下のように書くこともできます。
1 2 3 4 5 6 7 8 |
json.post do json.title @post.title json.text @post.text end # {"post" : {"title" : "タイトル", "text" : "テキスト"}} |
インスタンス変数の中身が複数のとき
1 2 3 4 5 6 7 |
class PostsController < ApplicationController def index @posts = Post.all end end |
array!メソッド
配列を回して値を返すことができるメソッドです。
返す値は配列になります。
1 2 3 4 5 |
json.array! @posts, :title, :text # [{"title" : "タイトル1", "text" : "テキスト1"}, {"title" : "タイトル2", "text" : "テキスト2"}] |
特定のキーでまとめて、配列を回したい場合は以下のように書きます。
1 2 3 4 5 6 7 |
json.post do json.array! @posts, :title, :text end # {"post" : [{"title" : "タイトル1", "text" : "テキスト1"}, {"title" : "タイトル2", "text" : "テキスト2"}]} |
最後に
JSONは配列とオブジェクトをネスト構造で表現できるため、どんなに複雑なデータ構造でも規定可能だそうです。
JSONを簡単に生成するJbuilderは、開発する上で扱う機会が多くなりそうです。
復習しつつ知識を定着させたいと思います。
以上です!