RubyonRails

Rails 7 APIモードで本番レベルのTodo APIを作る手順

ⓘ本ページはプロモーションが含まれています

スポンサードリンク

Rails 7 API モードのセットアップ

Rails 7 の API モードは、不要なミドルウェアやビュー関連コードを除外した最小構成でプロジェクトを開始できる点が魅力です。このセクションでは Ruby と Rails のインストールから rails new my_api --api による雛形作成までの手順と、Rails 7.1 で変更されたデフォルト設定について解説します。

Rails のインストールと --api オプションの意味

まずは Ruby(3.2 系) と Rails 7 を導入し、API 用プロジェクトを生成します。

  • --apiActionController::API ベースのミドルウェアスタックを作成し、HTML ビューや Asset Pipeline の設定を省きます。
  • 生成されるディレクトリは app/controllers, app/models, config/routes.rb だけになるため、軽量かつ起動が速くなります。

Zeitwerk と Hotwire の取り扱い(Rails 7.1 の変更点)

Rails 7 系ではデフォルトコードローダーとして Zeitwerk が採用されており、app/ 以下のファイル名とクラス名が一致すれば自動ロードされます。API モードでも同様に機能します。

重要:Rails 7.1 からは gem 'hotwire-rails' がデフォルト Gemfile から除外されるため、API アプリを作成した直後に Hotwire 関連の設定が残っていることはありません。フロントエンドが別プロセスになるケースでは、特に意識せずにそのまま利用できます。


本番環境で必要なミドルウェアと CORS/HTTPS 設定

本番向け API では、セキュリティ・パフォーマンス確保のために追加ミドルウェアや HTTPS 強制が必須です。この章では除外されるミドルウェアの確認方法と、CORS とレートリミットを実装する手順を示します。

デフォルトで除外されるミドルウェア一覧

rails new --api が生成しない主なミドルウェアは次の通りです。

除外されたミドルウェア 主な役割
ActionDispatch::Cookies Cookie の管理
ActionDispatch::Session::CookieStore セッション管理
Rack::MethodOverride HTTP メソッドの上書き
Sprockets (Asset Pipeline) 静的資産配信

API アプリでは Token 認証が主流なため Cookie/Session は不要です。その代わり CORSレートリミット が重要になります。

rack‑cors と rack‑attack の導入手順

Gemfile に以下を追記し、バンドルします。

続いて config/application.rb 内でミドルウェアスタックに組み込みます。

rack-attack の具体的なルールは config/initializers/rack_attack.rb に記述します。

production.rb における HTTPS 強制設定例

本番環境では force_ssl を有効にし、HSTS ヘッダーを付与します。

force_ssl が有効になると HTTP リクエストは自動的に HTTPS にリダイレクトされるため、クライアント側でも https:// エンドポイントを使用してください。


API 用コントローラと名前空間ルーティングの設計

大規模な API ではバージョニングや機能ごとの分割が保守性の鍵になります。この章では Api::V1 名前空間の作り方と、実務で推奨されるルーティング構造を示します。

名前空間ディレクトリと BaseController の作成

まずは名前空間用フォルダと共通ロジックを持つベースコントローラを生成します。

BaseControllerActionController::API を継承し、認証やエラーハンドリングの共通処理を配置します。

ルーティングベストプラクティス

config/routes.rb に名前空間とバージョニングを明示すると、将来的な拡張が楽になります。

  • defaults: { format: :json } により拡張子が省略されたリクエストでも JSON が返ります。
  • 認証は専用コントローラに分離し、ビジネスロジックと切り分けて保守性を高めます。

JSON シリアライザの選択肢と実装例

JSON の生成方法として代表的なのは ActiveModelSerializers (AMS)Jbuilder です。ここでは両者の特徴比較と、シンプルな実装サンプルを示します。

AMS と Jbuilder の比較表

以下の観点で違いを整理しました。

項目 ActiveModelSerializers (AMS) Jbuilder
宣言的 DSL あり(serializer クラス) なし(Ruby スクリプト)
再利用性 高い(同一 serializer を複数で使用可) 中程度(部分テンプレートで対応)
パフォーマンス 大量データ時に若干遅くなることがある ビュー側ロジックなので高速
カスタム属性 attributes メソッドで簡単追加 Ruby で自由記述可能
学習コスト DSL に慣れが必要 基本的な Rails ビューと同等

選択指針:共通レスポンスや入れ子構造が頻繁に出る中規模以上の API では AMS、シンプル CRUD のみであれば Jbuilder が手軽です。

AMS のシンプル実装例

Gemfile に AMS を追加し、シリアライザを生成します。

生成された app/serializers/todo_serializer.rb は次のようになります。

コントローラ側では render json: だけで自動的に適用されます。

Jbuilder の基本例

Jbuilder は Rails に標準同梱されているため追加依存がありません。テンプレートは app/views/api/v1/todos/index.json.jbuilder に作成します。

コントローラはインスタンス変数を設定して render するだけです。


認証・テスト・デプロイの実践フロー

本番レベルの API に求められるトークン認証、テスト自動化、Docker 化と CI/CD の流れを具体例で示します。JWT を手書きするパターンと devise_token_auth で簡易化するパターンの両方を紹介します。

カスタム JWT 実装(自前実装)

まずは JWT 用 gem を追加し、認証ロジックとトークンサービスクラスを作ります。

認証コントローラ例

JwtService 実装

BaseController に認証フィルタを追加

devise_token_auth を利用する場合

認証を外部ライブラリに委託したいときは以下の手順でセットアップします。

生成されたエンドポイントは次の通りです。

メソッド パス 内容
POST /auth ユーザー登録
POST /auth/sign_in ログイン(トークン発行)
DELETE /auth/sign_out ログアウト

この方法はセッション管理・トークンリフレッシュまで自動処理してくれるため、実装コストが大幅に削減できます。

RSpec と FactoryBot による API エンドポイントテスト例

テスト用 gem を追加し、認証付きリクエストスペックを作成します。

リクエストスペック

FactoryBot 定義例

テストは bundle exec rspec で実行し、CI パイプラインに組み込めばコードプッシュ時に自動検証が走ります。

Docker 化と GitHub Actions による CI/CD 構成

本番デプロイを自動化するための最小構成として Dockerfile、docker‑compose、GitHub Actions ワークフローを提示します。

Dockerfile(production 用)

docker‑compose(開発・テスト環境)

GitHub Actions(CI/CD)概要

このワークフローはプッシュ時にテストを実行し、全テストが成功したら Docker イメージをビルド・プッシュします。Render、Fly.io などの PaaS にデプロイすれば、本番環境へ自動的に反映できます。


まとめ

  • rails new my_api --api で最小構成の API アプリが即座に生成でき、Rails 7.1 では hotwire-rails が除外される点を意識すれば不要な設定は省けます。
  • 本番環境では CORS (rack-cors) とレートリミット (rack-attack) を追加し、HTTPS は force_ssl + HSTS で強制します。
  • 名前空間 (Api::V1) と namespace :api ルーティングを採用すればバージョニングと保守性が向上します。
  • JSON の生成は AMS(再利用性重視)か Jbuilder(シンプルさ重視)のどちらでも実装可能です。
  • 認証は自前 JWT で柔軟に、または devise_token_auth で迅速に構築できます。
  • RSpec + FactoryBot によるテストと Docker + GitHub Actions の CI/CD パイプラインを整えることで、コード品質とデプロイの安全性が確保されます。

これらの手順を踏めば、Rails 7 API モードで本番レベルのバックエンドサービスを短時間で構築・運用できるようになります。次は実際に「Todo API」サンプルを作成し、GitHub に公開してみましょう!

スポンサードリンク

-RubyonRails