はじめに
今回は、Dockerを使ってRailsのAPIモードの環境構築をしていく記事です。
コマンド、設定などを詳細に書いていきます。
記事の最後までの所要時間は30分以内です。意外と簡単でした。
APIモードとは
APIモードとはRails5から追加された機能で、APIのようなRailsアプリケーションを作れる機能だそうです。
MVCのうち、モデルとコントローラーのみが作成されます。
APIモードで作成されたアプリのURLにリクエストを送ると、json形式のデータがレスポンスとして返ってきます。
環境構築
では、環境構築をしていきます。
$ mkdir sample_app
$ cd sample_app
$ docker pull ruby:2.5.1
$ docker run --rm -v "$PWD":/usr/src/sample_app -w /usr/src/sample_app ruby:2.5.1 bundle init
$ docker build -t developer_name/sample_app .
ここで、Dockerfile、docker-compose.yml、Gemfile、Gemfile.lockの4つのファイルが必要となるので、sample_app以下にそれぞれ作っていきます。
$ touch 各ファイル
Dockerfileのsample_appはそれぞれのディレクトリ名に変更してください。
# Debianがベースのrubyイメージを指定
FROM ruby:2.5.1
# 必要なものをインストール
RUN apt-get update -qq && apt-get -y install \
build-essential \
libpq-dev \
nodejs \
mysql-client
# rails用のディレクトリを作成
RUN mkdir /sample_app
# ローカルマシン(Mac)からコンテナの中にファイルをコピー
COPY Gemfile /API_sample
COPY Gemfile.lock /sample_app
# 作業ディレクトリを指定
WORKDIR /sample_app
# 上でコピーしたGemfileに従ってGemをインストール
RUN gem install bundler && bundle install
続いて、docker-compose.ymlです。
MYSQL_ROOT_PASSWORDは、後で作成するdatabase.ymlのパスワードに合わせます。
version: '3'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
volumes:
- .:/API_sample
command: bundle exec rails s -p 3000 -b '0.0.0.0'
db:
image: mysql:5.7
volumes:
- mysql_data:/var/lib/mysql/
environment:
MYSQL_ROOT_PASSWORD: password
ports:
- "3306:3306"
volumes:
mysql_data:
Railsアプリの作成
新規アプリ作成時に、後ろに--apiをつけるとAPIモードでアプリが作成されます。
$ docker-compose run web rails new . --force --database=mysql --api
$ docker-compose run --rm web rails generate scaffold User name:string
$ docker-compose run --rm web rails db:create
$ docker-compose run --rm web rails db:migrate
scaffoldでUserを作ったら、ファイルを見てみましょう。
普通のrailsアプリで作られるassetsやviewが無いことが確認できると思います。
ページを開く
それでは、アプリをlocalhostで開いてみましょう。
http://localhost:3000/users
真っ白なページに、[]とだけ表示されているはずです。
これは、データが空であるということを表しています。
では、curlコマンドでデータのリクエストを送ってみます。
curlはURLシンタックスを用いてファイルを送信または受信するコマンドラインツールである。(Wikipediaより)
下記の例を簡単に説明すると、指定したURLに対して、POSTメソッドを使用してターミナルからjsonファイルを送信しているということです。
$ curl -X POST -H "Content-Type: application/json" -d '{"name": "hoge"}' http://localhost:3000/users
そして、http://localhost:3000/users に接続すると
[{"id":1,"name":"hoge","created_at":"","updated_at":""}]というデータが表示されると思います。(日付はカットしました)
これで完了です!意外とあっさりできますよね。
他にも、GET、PUT、DELETEも使えるので色々と試してみてください。
感想
APIモードと聞いて最初はよくわからないな、怖いなと思っていました。
ですが、やってみると簡単ですし、今まで深く考えていなかったHTTPについて調べたり知ったりするきっかけになったので良かったです。
駆け出しエンジニアにとっても簡単なのでぜひやってみてはいかがでしょうか?