👶
【作業Log】Rails6系で本の管理APIを作ってみる①
はじめに
ご覧いただきありがとうございます。mocです。
最近、お仕事でRailsを使うようになったので、そのお勉強も兼ねて本の管理をするためのAPIを作ってみようと思います。
初心者なので、やり方間違ってたりコードがおかしかったりする可能性があります。
その際は、ご指摘いただけるととても嬉しいです。
今回の内容
今回は、プロジェクトの作成からAPIのベースを簡単に作って、Postmanで叩いてみるところまでやっていきます。
作業ログのような形で書くので、詳しい説明はあまり入ってません。
作っていく中で理解が深まってきたら、まとめ直すか、加筆していく予定です。
それではやっていきます。
開発環境
$ sw_vers
ProductName: macOS
ProductVersion: 11.3.1
BuildVersion: 20E241
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.arm64e-darwin20]
$ rails --version
Rails 6.1.3.2
APIモードでプロジェクトを作成
# プロジェクト用のディレクトリを作成
$ mkdir book_manage_api
$ cd book_manage_api
# APIプロジェクトをカレントディレクトリに作成
$ rails new . --api
# 作成されたディレクトリたち(1階層分のみ)
$ tree -L 1
.
├── Gemfile
├── Gemfile.lock
├── README.md
├── Rakefile
├── app
├── bin
├── config
├── config.ru
├── db
├── lib
├── log
├── public
├── storage
├── test
├── tmp
└── vendor
本のモデルとコントローラを作成する
# modelを作成
$ rails g model book title:string author:string
# controllerを作成
$ rails g controller books
ルーティングを変更する
routes.rb
Rails.application.routes.draw do
namespace 'api' do
namespace 'v1' do
resources :books
end
end
end
ディレクトリ構成を変更する
$ mkdir -p app/controller/api/v1
$ mv app/controller/books_controller.rb app/controller/api/v1/books_controller.rb
コントローラを修正する
1. ルーティングに合わせる
books_controller.rb
module Api
module V1
class BooksController < ApplicationController
end
end
end
2. メソッドを追加する
今回は、下記のことができるようにする
- 本の情報の一覧を取得(index)
- 特定の本の情報を取得(show)
- 本の情報を作成(create)
- 特定の本の情報を更新(update)
- 特定の本の情報を削除(destroy)
books_controller.rb
module Api
module V1
class BooksController < ApplicationController
before_action :set_book, only: %i[show update destroy]
def index
books = Book.order(created_at: :desc)
render json: { status: :ok, data: books }
end
def show
render json: { status: :ok, data: @book }
end
def create
book = Book.new(book_params)
if book.save
render json: { status: :ok, data: book }
else
render json: { status: :bad_request, data: book.errors }
end
end
def update
if @book.update(book_params)
render json: { status: :ok, data: @book }
else
render json: { status: :ok, data: @book.errors }
end
end
def destroy
@book.destroy
render json: { status: :ok, data: @book }
end
private
def set_book
@book = Book.find(params[:id])
end
def book_params
params.require(:book).permit(:title, :author)
end
end
end
end
3. 確認してみる
Postmanというツールを使ってこのAPIを叩いてみます。
その前に、開発サーバを立ち上げるのをお忘れなく。
$ rails s
こんな感じで、ちゃんと値が返ってきました。
まとめ
こんなに簡単にAPI体験できるのは楽しい。
次は、RSpecを導入して、テストコードを書く練習をば!
Discussion