#author("2022-07-08T15:18:45+00:00","default:src128","src128")
#author("2022-07-08T15:19:08+00:00","default:src128","src128")
&tag(Rails/JSON);
*目次 [#y25de75b]
#contents
*関連ページ [#if6cefb2]
*参考情報 [#h11cacd4]


*ActiveRecordのサブクラスをJSONに変換 [#jc79ea3b]

**一番簡単な例 [#a4157da9]

-to_jsonで変換可能
#pre{{
    book = Book.new
    book.title = "abc"
    json = book.to_json
    # puts jsonでもよいがわかりやすくフォーマットしたい場合以下を使う。
    puts JSON.pretty_generate(JSON.parse(json))
}}
-以下の出力が得られる
#pre{{
{
  "id": null,
  "title": "abc",
  "author": null,
  "summary": null,
  "created_at": null,
  "updated_at": null,
}
}}

**モデル名を追加する [#peab1bfa]
-モデル名を追加したい場合「ActiveRecord::Base.include_root_in_json = false」あるいは「to_json(root: true)」を使用する。
#pre{{
    ActiveRecord::Base.include_root_in_json = false
    book = Book.new
    book.title = "abc"
    json = book.to_json(root: true)
    #puts json
    puts JSON.pretty_generate(JSON.parse(json))
}}
-以下の出力が得られる
#pre{{
{
  "book": {
    "id": null,
    "title": "abc",
    "author": null,
    "summary": null,
    "created_at": null,
    "updated_at": null,
  }
}
}}

**カスタム属性を追加する [#cb8f47e0]
-テーブルに対応していないデータを出力したい場合、as_jsonをオーバーライドする。rootを出力するかどうかを考慮すると以下のような感じ?
#pre{{
  def as_json(options = nil)
    root = if options && options.key?(:root)
             options[:root]
           else
             include_root_in_json
           end
    result = super(options)
    h = result
    if root
      h = result[model_name.element]
    end
    h["custom_title"] = "custom #{title}"
    result
  end
}}

-出力。
#pre{{
{
  "book": {
    "id": null,
    "title": "abc",
    "author": null,
    "summary": null,
    "created_at": null,
    "updated_at": null,
    "custom_title": "custom abc"
  }
}
}}

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS