Closed7

RailsのAPIモードで簡単なCRUDをしてみる

こじまこじま

簡単な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": {...}} とクラス名がいるのに取得のときはそれがない非対称性はそういうものということなのだろうか

こじまこじま

どうやら:

  1. rails generate migration CreateHouses などのコマンドでマイグレーションファイルができる
  2. マイグレーションをあてる( bin/rails db:migrate )前に ${datetime}_create_houses.rb の中身のカラムを編集する
  3. 実際にマイグレーションを当てる; bin/rails db:migrate
  4. validation は models ファイルに書くらしい
  5. /api/v1/houses のようにルーティングしたいときは controllers/api/v1/houses_controller.rb のようにファイルを作る(ファイル名を間違えるとエラー!)
  6. routes.rb でルーティング。 namespace api{ |do| namespace {|v1| ...} } のように namespace で block を作ればいいらしい
このスクラップは2023/12/21にクローズされました