Closed7
RailsのAPIモードで簡単なCRUDをしてみる
とりあえず Rails による API 専用アプリケーション - Railsガイド というドキュメントを見つけたので読む。
簡単なCRUDはこれで作れるらしい:
bin/rails g scaffold Group name:string
bin/rails db:migrate
これで次のようなコントローラーが生成される。
class GroupsController < ApplicationController
before_action :set_group, only: %i[ show update destroy ]
# GET /groups
def index
@groups = Group.all
render json: @groups
end
# GET /groups/1
def show
render json: @group
end
# POST /groups
def create
@group = Group.new(group_params)
if @group.save
render json: @group, status: :created, location: @group
else
render json: @group.errors, status: :unprocessable_entity
end
end
# PATCH/PUT /groups/1
def update
puts group_params
if @group.update(group_params)
render json: @group
else
render json: @group.errors, status: :unprocessable_entity
end
end
# DELETE /groups/1
def destroy
@group.destroy!
end
private
# Use callbacks to share common setup or constraints between actions.
def set_group
@group = Group.find(params[:id])
end
# Only allow a list of trusted parameters through.
def group_params
params.require(:group).permit(:name)
end
end
この辺は雰囲気だけならDjango Restframeworkと一緒って感じ
実際のインターフェースは次のようになるようだ。
$ curl http://localhost:3000/groups | jq .
[
{
"id": 2,
"name": "たなかたろう",
"created_at": "2023-12-16T05:01:22.990Z",
"updated_at": "2023-12-16T05:14:01.628Z"
},
{
"id": 3,
"name": "John Doe",
"created_at": "2023-12-16T05:01:35.993Z",
"updated_at": "2023-12-16T05:01:35.993Z"
},
{
"id": 4,
"name": "さとうたけし",
"created_at": "2023-12-16T05:14:55.602Z",
"updated_at": "2023-12-16T05:14:55.602Z"
}
]
curl http://localhost/groups/:id
で単一取得もできる。
# 作成
curl -X POST -H 'Content-Type: application/json' -d '{"group":{"name": "さとうたけし"}}' http://localhost:3000/groups | jq .
{
"id": 5,
"name": "さとうたけし",
"created_at": "2023-12-16T05:20:42.419Z",
"updated_at": "2023-12-16T05:20:42.419Z"
}
# 更新
curl -X PUT -H 'Content-Type: application/json' -d '{"group":{"name": "たなかたろう"}}' http://localhost:3000/groups/2 | jq .
{
"name": "たなかたろう",
"id": 2,
"created_at": "2023-12-16T05:01:22.990Z",
"updated_at": "2023-12-16T05:14:01.628Z"
}
# 削除
curl -X DELETE http://localhost:3000/groups/1
リクエストのときは {"group": {...}}
とクラス名がいるのに取得のときはそれがない非対称性はそういうものということなのだろうか
もうちょっとなにしているかを具体的に知りたくて、手動で Rails にエンドポイントを追加する方法を調べる。
How to create a Rails API From SCRATCH | by Fadi Tillman | Medium
どうやら:
-
rails generate migration CreateHouses
などのコマンドでマイグレーションファイルができる - マイグレーションをあてる(
bin/rails db:migrate
)前に${datetime}_create_houses.rb
の中身のカラムを編集する - 実際にマイグレーションを当てる;
bin/rails db:migrate
- validation は models ファイルに書くらしい
-
/api/v1/houses
のようにルーティングしたいときはcontrollers/api/v1/houses_controller.rb
のようにファイルを作る(ファイル名を間違えるとエラー!) -
routes.rb
でルーティング。namespace api{ |do| namespace {|v1| ...} }
のように namespace で block を作ればいいらしい
Ruby の block の戻り値がよくわからない。
このスクラップは2023/12/21にクローズされました