Help us understand the problem. What is going on with this article?

Rails JBuilder 入れ子・配列・部分テンプレートのサンプル

More than 5 years have passed since last update.

出力したいJSON

入れ子構造と配列を組み合わせた JSON を出力しています。

{
  "companies": [
  {
    "id": 1,
    "name": "Nintendo",
    "staffs": [
    {
      "id": 1,
      "name": "Iwataさん"
    }
    ]
  },
  {
    "id": 2,
    "name": "Google",
    "staffs": [ ]
  }
  ]
}

ソースコード

json.jbuilder ファイル

app/views/companies/index.json.jbuilder
# companies.json にアクセスすると、このjbuilderが呼ばれる

# json.キー名 do ~ end を使うと、
# 入れ子構造を作ることができる
json.companies do
  # json.array!(配列) do |要素名| end を使うと、
  # 配列構造を作ることができる
  json.array!(@companies) do |company|
    # json.partial! モデル変数 を使うと、
    # 部分テンプレートを表示する
    json.partial!(company)
  end
end
app/views/companies/_company.json.jbuilder
# 部分テンプレート(会社)

# company 変数は、
# 部分テンプレートの呼び出し元で渡された引数。
json.id(company.id)
json.name(company.name)
# 入れ子構造を作る
json.staffs do
  # 配列構造を作る
  json.array!(company.staffs) do |staff|
    # 従業員の部分テンプレートを表示
    json.partial!(staff)
  end
end
app/views/staffs/_staff.json.jbuilder
# 部分テンプレート(従業員)

# staff 変数は、
# 部分テンプレートの呼び出し元で渡された引数。
json.id(staff.id)
json.name(staff.name + 'さん')

Controller

scaffold で生成したものをそのまま使っています。

sccafold.sh
rails g scaffold company name:string
rails g scaffold staff name:string

Model

app/models/company.rb
class Company < ActiveRecord::Base
  has_many :staffs
end
app/models/staff.rb
class Staff < ActiveRecord::Base
  belongs_to :company
end
sutonea
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away