Rails APIについて学習しています。
今回は、アクセスしたときに記事の一覧を取得するAPIを作成していきます。
-
http://localhost:3000/api/v1/articles
にアクセス - 記事の一覧をJSON形式で取得する
出力イメージ(Postman)
事前準備
以下、モデル・テーブルを事前に準備していることを前提にしています。
- Userテーブル
- Profileテーブル
- Articleテーブル
- Commentテーブル
fast_jsonapiを使用して実装していく
- jsonのserializer は fast_jsonapi を使用していきます。
- fast_jsonapiとは、Netflixが提供しているgemのこと。
- Ruby on RailsのAPI開発でよく使われるJSONシリアライズライブラリ。
- シリアライズの速さを重視して作られているのが特徴。
- このライブラリを使うと、RubyオブジェクトをJSON形式に変換する処理を高速化できる
- jsonのserializerとは、json を生成する仕組みのこと。
- 現在このパッケージは、保守がなされていないようなので、今後は使用する機会は少ないかも?
fast_jsonapiをインストール
gem 'fast_jsonapi'
バンドルインストールを実行
$ bundle install
コマンドで新しいシリアライザーを作成
$ rails g serializer Article title contents status
上記コマンドを実行すると、app/serializers/article_serializer.rb
が生成されます。
生成されたシリアライザーに設定を追記
class ArticleSerializer
include FastJsonapi::ObjectSerializer
attributes :title, :contents, :status
belongs_to :user # ← ここを追記
end
- このコードは、RubyのSerializerクラスを定義している。
- 具体的には、ArticleモデルのデータをJSON形式に変換するための設定が書かれている。
- まず、
class ArticleSerializer
という行で、ArticleSerializer
という新しいクラスを定義している。 -
include FastJsonapi::ObjectSerializer
というモジュールを取り込んでいる。 -
FastJsonapi
はNetflixが開発した高速なJSON APIのシリアライズライブラリ。この行により、ArticleSerializer
クラスはFastJsonapi::ObjectSerializer
の機能を使えるようになる。 -
attributes :title, :contents, :status
では、Articleモデルの:title, :contents, :status
の3つの属性を取り出し、JSONに変換することを指定している。 -
belongs_to :user
は、ArticleモデルがUserモデルに属していることを示す関連付けを定義している。これにより、ArticleのデータをJSONに変換する際に、関連するUserのデータも一緒に取得できるようになる。
コントローラで一覧記事を呼び出す実装
# app/controllers/api/v1/articles_controller.rb
module Api
module V1
class ArticlesController < BaseController
def index
articles = Article.all
json_string = ArticleSerializer.new(articles).serialized_json
render json: json_string
end
end
end
end
- このコードは、Ruby on RailsのAPIコントローラーを定義している。
- 具体的には、
Api::V1::ArticlesController
という名前のクラスが定義されていて、その中にindexという名前のアクションがある。 - このindexアクションは、全てのArticleレコードを取得し、それらをJSON形式に変換してクライアントに返す役割を持っている。
- まず、
articles = Article.all
では、全てのArticleレコードを取得して、それらをarticlesという変数に代入している。 - 次に
json_string = ArticleSerializer.new(articles).serialized_json
という行では、取得したArticleレコードをJSON形式に変換している。 - 具体的には、
ArticleSerializer
のインスタンスを作り、そのserialized_json
メソッドを呼び出している。 - そして、最後に
render json: json_string
という行で、変換したJSONをクライアントに返している。
最後にPostmanでリクエストを送ってみる
GET http://localhost:3000/api/v1/articles
無事、記事一覧のレスポンスをJSON形式で取得する事ができました。
また、ブラウザでアクセスしてみると、以下のような表示で確認できます。