はじめに
Railsのscaffoldは、1つのコマンドで、リソースのコントローラ、モデル、テンプレートを作成することができます。このチュートリアルでは、わずか数ステップで簡単なAPIを作成します。
このチュートリアルでは、PCにRuby on Rails 5が正常にインストールされていることを前提に説明します。
私が作成した他のチュートリアルのルールに従って、今回は野球選手のリストを管理するためのAPIを作成します。
プロジェクトのディレクトリを作成
Rails 5には「-api」オプションがあり、これはプロジェクトにビューが必要ないことを意味します。
Railsで新しいAPIプロジェクトを作成するには、以下を実行します。
rails new player_api --api
cd player_api
scaffoldを利用してリソースを生成する
今回のプロジェクトはAPIとして作成されているため、コントローラとモデルのみを作成します。scaffoldingでテンプレートが生成されることはありません。
rails g scaffold Player name:string age:integer
./app/controllers/players_controller.rb を見てみましょう。以下のようなコードが表示されるはずです。生成されたコントローラは、APIでないコントローラと見た目が異なることに注意してください。
具体的には、メソッドはJSONのみを受け取り、返します。
class PlayersController < ApplicationController
before_action :set_player, only: [:show, :update, :destroy]
# GET /players
def index
@players = Player.all
render json: @players
end
# GET /players/1
def show
render json: @player
end
# POST /players
def create
@player = Player.new(player_params)
if @player.save
render json: @player, status: :created, location: @player
else
render json: @player.errors, status: :unprocessable_entity
end
end
# PATCH/PUT /players/1
def update
if @player.update(player_params)
render json: @player
else
render json: @player.errors, status: :unprocessable_entity
end
end
# DELETE /players/1
def destroy
@player.destroy
end
private
# アクション間で共通の設定や制約を共有するには、コールバック(before_action)を使用します
def set_player
@player = Player.find(params[:id])
end
# 信頼できるパラメータのみ通過させる
def player_params
params.require(:player).permit(:name, :age)
end
end
データのシード化とDBへの変更点の移行
データベースにプレイデータを追加してみましょう。./db/seeds.rb ファイルに以下のコードを追加するだけです。
Player.create(name: 'Ogino Takashi', age: 36)
Player.create(name: 'Fujiwara Kyota', age: 21)
Player.create(name: 'Nakamura Shogo', age: 29)
以下の2つのコマンドを使用して、変更内容をマイグレートし、シードします。
rails db:migrate
rails db:seed
サーバーを起動する
rails s
動作確認
サーバーが起動した状態で、Webブラウザーを開いて http://localhost:3000/players にアクセスすると、すぐにリソースのGETができます。アクセスすると、シードされたレコードのJSONが表示されるはずです。
今度はRESTクライアントを使って、POSTとDELETEアクションを確認してみましょう。
以下の例では、LinuxやMacOSシステムにデフォルトでインストールされていることが多いcurlを使用しています。
以下のようにして、IDが1の選手をDELETEすることができます。
curl -X DELETE http://localhost:3000/players/1
次に、以下の方法で新しい選手をPOSTしてください。
curl -X POST -H "Content-Type:application/json" -d '{ "name": "Yasuda Hisanori", "age": "22" }' http://localhost:3000/players
以下は、DELETEとPOSTの操作後の結果です。