RubyonRails

Rails 7 API 開発環境の構築とベストプラクティス

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

スポンサードリンク

開発環境のセットアップ

このセクションでは、Rails 7+ の API アプリを ローカルコンテナ の両方で快適に動かすために必要なツール群と、そのインストール手順・設定方法を解説します。バージョン管理が不十分だと「自分の環境では動く」の罠にはまりやすく、チーム全体で同一の Ruby/Gems 環境を保つことが重要です。

Ruby とバージョン管理ツールのインストール

rbenv(macOS)または asdf(Linux/macOS)を用いて Ruby のバージョンと gemset を固定します。以下は macOS で rbenv + rbenv-gemset プラグインを使う例です。

.ruby-version.ruby-gemset をリポジトリへコミットしておけば、git clone 後に rbenv installrbenv gemset create だけで同一環境が再現できます。

Bundler のバージョン確認と互換性対応

Bundler 2.1 以降では bundle add <gem> が使えますが、古い CI 環境や社内サーバーでは 2.0 系がインストールされているケースがあります。そのため 必ずバージョンを確認し、必要に応じて従来の手順へフォールバック できるようにします。

ポイント
- Gemfile に直接記述する方法(gem 'pg' 等)はすべての環境で動作します。
- bundle install --without development test といった除外オプションは 本番イメージ構築時だけ 用いるようにし、ローカル開発では全 gem をインストールしておきます。


API モードでプロジェクトを作成

この章では Rails の --api フラッグとテストフレームワーク RSpec のセットアップ手順を示します。API アプリはビュー系ミドルウェアが省かれるため軽量ですが、開発時に必要な gem が欠如するとすぐにビルドエラーになる ので注意が必要です。

新規プロジェクトの生成と RSpec の導入

ポイント
- -T オプションでデフォルトの MiniTest を除外し、RSpec に完全に置き換えます。
- bundle add が使えない環境でも手動で Gemfile に追記すれば同等の結果が得られます。


基本的な RESTful エンドポイントの実装

ここでは 記事 (Article) リソースを例に、名前空間付き API のルーティング・コントローラ・モデル・バリデーションまで一通り実装します。RESTful 設計は外部クライアントとの合意形成をシンプルにし、将来の拡張やテスト自動化にも好影響を与えます。

ルーティングの定義

コントローラ実装

モデルとバリデーション

ポイント
- 名前空間 (Api::V1) と defaults: { format: :json } により、全エンドポイントが JSON を返すことを保証します。
- バリデーションはモデル側に集中させ、コントローラは「成功/失敗」の分岐だけに留めます。


シリアライザ・CORS・JWT 認証の設定

API の実運用では 出力フォーマット統一外部ドメインからのアクセス許可、そして ステートレス認証 が必須です。このセクションでそれぞれの導入手順を示します。

JSON シリアライザ(ActiveModelSerializers)の導入

render json: @article と書くだけで AMS が自動的に上記属性だけを返します。

rack‑cors による CORS 設定

devise と devise‑jwt によるトークン認証

ポイント
- before_action :authenticate_user! を API コントローラに追加すれば、JWT が無いリクエストは自動的に 401 エラーになります。


テスト・バージョニング・Docker コンテナ化・デプロイ

この最終章では 安全なリリースフロー を構築するための3つの柱(テスト、コンテナ、CI/CD)を具体的に示します。各工程が自動化されていれば、コード変更時に人為的ミスが入りにくく、運用コストも大幅に削減できます。

API バージョニングのベストプラクティス

  • URL に api/v1/ を必ず含め、コントローラも同様に名前空間で分離します。
  • 非互換変更は新しい名前空間を作成し、旧バージョンはそのまま残すことでクライアント側の移行期間を確保できます。

RSpec と factory_bot によるテスト基盤

テストは bundle exec rspec でローカル実行でき、GitHub Actions 等の CI に組み込めば プッシュごとに自動検証 が走ります。

Dockerfile の改善(開発用 vs 本番用)

Docker イメージをビルドするときは、開発時に必要な gem は除外しない ことが重要です。以下のように ビルドステージを分割 すれば、本番イメージは軽量化しつつローカル開発コンテナはフルセットで動作します。

docker-compose.yml(開発向け)

  • 開発 コンテナは builder ステージをそのまま使用し、全 gem が利用可能です。
  • 本番デプロイ の際は docker build --target production を実行すれば、不要な開発依存が除外された軽量イメージが生成されます。

CI/CD とデプロイ(Heroku / Render)

Render でも同様に Dockerfile環境変数RAILS_MASTER_KEY, DATABASE_URL, JWT_SECRET)を設定すれば、プッシュだけで自動ビルド・テストが走ります。GitHub Actions のサンプルワークフローは以下の通りです。

ポイント
- CI では RAILS_ENV=test と同一の PostgreSQL コンテナを立ち上げ、ローカルと同様にテストが実行できます。
- 本番デプロイは Dockerfile の production ステージを利用することで、最小サイズかつセキュリティリスクの少ないイメージが生成されます。


まとめ

本稿では .ruby-gemset の作成方法Bundler バージョン依存のインストール手順、そして Dockerfile が開発環境で gem を除外しないようにする対策 を含め、Rails 7+ API アプリを構築・テスト・デプロイするまでのフルパイプラインを解説しました。

  • .ruby-version.ruby-gemset によりチーム全員が同一 Ruby 環境を再現できる
  • Bundler のバージョンチェックで bundle add が使えない環境でも安全に gem を追加可能
  • マルチステージ Dockerfile で 開発時はフルセット、リリース時は軽量化 を実現

これらを順守すれば、ローカルと本番・CI の差異がほぼなくなり、変更に強い API サービスの運用が可能になります。ぜひ自プロジェクトで試してみてください。

スポンサードリンク

-RubyonRails