0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

記事の詳細情報を取得するRails APIの作成

Posted at

Rails APIの学習をしています。

今回は、articleモデルのデータを取得するAPIを作成していきます。

準備・使用環境

  • Netflixが提供するライブラリFastJsonapiを使用しています。
  • 以前の投稿と同様の環境構築をしていることを前提とした実装になります。

期待するJSONレスポンスのデータ

# http://localhost:3000/api/v1/articles/1 にアクセス

{
    "data": {
        "id": "1",
        "type": "article",
        "attributes": {
            "title": "MyString1",
            "contents": "MyText1",
            "status": "draft"
        },
        "relationships": {
            "user": {
                "data": {
                    "id": "1",
                    "type": "user"
                }
            }
        }
    },
    "included": [
        {
            "id": "1",
            "type": "user",
            "attributes": {
                "name": "MyString1",
                "email": "user+1@example.com"
            },
            "relationships": {
                "articles": {
                    "data": [
                        {
                            "id": "1",
                            "type": "article"
                        }
                    ]
                }
            }
        }
    ]
}

ArticlesControllerの実装

module Api
  module V1
    class ArticlesController < BaseController
      before_action :set_article, only: :show

      def show
        options = { include: [:user, :'user.name', :'user.email'] }
        options = { include: %i[user user.name user.email] }
        json_string = ArticleSerializer.new(@article, options).serialized_json

        render json: json_string
      end

      private

      def set_article
        @article = Article.find(params[:id])
      end
    end
  end
end

コードの解説

  • このコードは、RubyのWebアプリケーションフレームワークであるRailsで使われる、ArticlesControllerクラスの一部である。

  • class ArticlesController < BaseController は、ArticlesControllerという新しいクラスを作っていて、このクラスはBaseControllerという既存のクラスを継承している。

  • before_action :set_article, only: :show は、showアクションが呼ばれる前に、set_articleメソッドを実行するように指定している。

  • def set_article は、set_articleというメソッドを定義している。このメソッドは、Article.find(params[:id])というコードを使って、指定したIDの記事をデータベースから探し出し、@articleインスタンス変数に保存している。

  • 記事の詳細を返すshowメソッド。

  • RubyのWebアプリケーションフレームワークであるRailsでよく使われる形。

  • options = { include: [:user, :'user.name', :'user.email'] } は、記事の情報と一緒に関連するユーザーの情報(名前とメールアドレス)も取得するためのオプションを設定している。

  • json_string = ArticleSerializer.new(@article, options).serialized_json は、@article(記事)と設定したオプションを使い、記事の情報をJSON形式に変換している。

  • この時に使われるArticleSerializerは、記事のデータをどのようにJSON化するかを定義したクラスである。

  • 最後に render json: json_string で、変換したJSONをレスポンスとして返している。

Userシリアライザーの作成

コマンドでUserシリアライザーを生成します。

$ rails g serializer User name email

生成したシリアライザーにアソシエーションを追記

# user_serializer.rb

class UserSerializer
  include FastJsonapi::ObjectSerializer
  attributes :name, :email
  has_many :articles
end

コードの解説

  • このコードは、UserSerializerというクラスを定義している。
  • これはFastJsonapiを使って、UserオブジェクトをJSON形式に変換するための設定を書いているクラスである。
  • include FastJsonapi::ObjectSerializer は、FastJsonapiObjectSerializerモジュールをこのクラスに取り込むためのコードである。
  • これによって、このクラスはJSONへの変換機能を持つようになる。
  • attributes :name, :email は、変換したJSONに含める属性を指定している。
  • この場合、UserオブジェクトのnameemailがJSONに含まれるようになる。
  • has_many :articles は、Userが複数のArticlesを持っている場合、それらのArticleも一緒にJSONに含めるように指示している。
  • ArticleオブジェクトはArticleSerializerによって変換されるべきである。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?