Rails7で最小構成からバックエンドAPIを開発する方法まとめ


 

こんにちは。Tomoyuki(@tomoyuki65)です。

私が最初に学び始めたフレームワークとしてはRailsですが、その後の実務ではLaravel(PHP)を使ってきました。

そんな私が久しぶりにRailsを触ってみたいと思ったのと、合わせてRailsの最小構成からAPIを開発する方法を試したかったので、やってみることにしました。

そこでこの記事では、私が久しぶりに試したRails7の最小構成でバックエンドAPIを開発する方法についてまとめておきます。

 

Railsの関連記事👇

SPA構成のWebアプリケーションを開発する方法まとめ【Docker・NextJS(React)・Vercel・Rails7(APIモード)・AWS ECS(Fargate)】

2022年11月22日

Railsチュートリアルをカスタマイズしてポートフォリオを作成する方法【Docker・Rails7・CircleCI対応】

2022年8月15日

Railsチュートリアル(第6版)を進めるための参考資料

2022年7月16日

 



Rails7で最小構成からバックエンドAPIを開発する方法まとめ

まず以下のコマンドを実行し、各種ファイルを作成します。

$ mkdir rails_sample
$ cd rails_sample
$ mkdir api
$ cd api
$ touch Gemfile
$ touch Gemfile.lock
$ touch .env
$ touch compose.yml
$ mkdir docker
$ cd docker
$ mkdir local
$ cd local
$ touch Dockerfile
$ cd ../..

 

source "https://rubygems.org"
gem "rails"

※railsのバージョンを指定していないため、最新版がインストールされます

 

RAILS_ENV=development
BUNDLER_VERSION=2.5.10
LANG=C.UTF-8
TZ=Asia/Tokyo
PORT=3010

 

services:
  api:
    container_name: rails-s-api
    build:
      context: .
      dockerfile: ./docker/local/Dockerfile
      args:
        - RAILS_ENV=${RAILS_ENV}
        - BUNDLER_VERSION=${BUNDLER_VERSION}
        - LANG=${LANG}
        - TZ=${TZ}
        - PORT=${PORT}
    volumes:
      - .:/api
    ports:
      - 3010:${PORT}
    env_file:
      - ./.env
    command: bundle exec puma -C "config/puma.rb"

※環境変数は「.env」で設定し、それを「args:」からDockerfile内へ流しています

 

## ビルドステージ
# 2024年5月時点の最新安定版Rubyの軽量版「alpine」
FROM ruby:3.3.1-alpine AS builder

# 環境変数
ARG RAILS_ENV
ARG BUNDLER_VERSION
ARG LANG
ARG TZ
ARG PORT

# インストール可能なパッケージ一覧の更新
RUN apk update && \
    apk upgrade && \
    # パッケージのインストール(ビルド時のみ使う)
    apk add --virtual build-packs --no-cache \
            alpine-sdk \
            build-base \
            curl-dev \
            mysql-dev \
            tzdata

# 作業ディレクトリの指定
WORKDIR /app

# ローカルにあるGemfileとGemfile.lockを
# コンテナ内のディレクトリにコピー
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

# bundlerのバージョンを固定する
RUN gem install bundler -v $BUNDLER_VERSION
RUN bundle -v

# bunlde installを実行する
RUN bundle install --jobs=4

# build-packsを削除
RUN apk del build-packs


## マルチステージビルド
# 2024年5月時点の最新安定版Rubyの軽量版「alpine」
FROM ruby:3.3.1-alpine

# 環境変数
ARG RAILS_ENV
ARG BUNDLER_VERSION
ARG LANG
ARG TZ
ARG PORT

# インストール可能なパッケージ一覧の更新
RUN apk update && \
    apk upgrade && \
    # パッケージのインストール(--no-cacheでキャッシュ削除)
    apk add --no-cache \
            bash \
            mysql-dev \
            tzdata \
            gvim \
            # rails newでgitを使用する(ファイル作成後は不要)
            git \
            # M系チップMacの場合に「gcompat」が必要
            gcompat

# 作業ディレクトリの指定
WORKDIR /api

# ビルドステージからファイルをコピー
COPY --from=builder /usr/local/bundle /usr/local/bundle
COPY . /api

# サーバー起動
EXPOSE 3010
CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]

※Dockerfileではマルチステージビルドで構築し、コンテナサイズの軽量化を図っています。

 

次に以下のコマンドを実行し、コンテナのビルドおよびRailsファイルの作成を行います。(ファイル作成時に.gitignoreは作成されて欲しいのでgit関連はスキップしていませんが、apiディレクトリ直下に.gitファイルは不要なので最後のコマンドで削除しています。)

$ docker compose build --no-cache
$ docker compose run --rm api rails new . -f -T -d mysql --api \
$ --skip-action-mailer --skip-action-mailbox --skip-action-text \
$ --skip-active-job --skip-active-storage --skip-action-cable \
$ --skip-asset-pipeline --skip-javascript --skip-hotwire --skip-jbuilder
$ rm -r .git

※rails newコマンドのオプションについて、「-f」はファイルを上書き、「-T」はテストコード関連をスキップ、「-d mysql」はDBにMySQLを指定、「–api」はAPIモード(そのままだとCookieやCORS設定などが使えないので注意)、それ以降の–skip〜も不要なものをスキップ。尚、オプションを「-f -T -d mysql –api –minimal」にしてもほぼ同じ結果になりますが、この場合は「bootsnap」もスキップされます。

 

成功すると以下のようにRailsの各種ファイルが作成されます。

 

次に一旦DBのMySQLの設定はスキップしたいため、一時的なDB設定として使えるnulldbのgem「activerecord-nulldb-adapter」をインストールします。

以下のようにファイル「api/Gemfile」の「group :development, :test do」の部分に「gem ‘activerecord-nulldb-adapter’」を追記します。

・・

group :development, :test do
  # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
  gem "debug", platforms: %i[ mri windows ]

  # 一時的なDB設定用にnulldbのgemを追加
  gem "activerecord-nulldb-adapter"
end

・・

 

次に「api/config/database.yml」を以下のように修正します。

・・

default: &default
  # 一時的なDB設定としてnulldbを指定
  # adapter: mysql2
  adapter: nulldb
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  host: localhost

・・

 

次にコンテナを再ビルドし、コンテナを起動します。

$ docker compose build --no-cache
$ docker compose up -d

 

次にブラウザで「http://localhost:3010」にアクセスし、以下のように表示されればOKです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です