*見習いエンジニア向けです
こちらの記事の方が簡潔で短く書けます。
やること
Ruby on Railsを用いてバックエンドを実装している際に、フロントがid=1を指定します。
その際にid=1のものが存在しなかった場合に、バックエンド側でidを作成し、レコードを返すという実装をしたいと思いました。
手順1
フロントエンドからID=1が返ってこなかった場合に、Railsで新しいIDを作成してレコードを作成するか、既存のレコードを更新する。
- 今回はItemsControllerというコントローラーを作成
- PUTに処理を書く
- idが1のitemを探す
- id = 1のitemが見つからない場合(nilの場合).newで新しく作成する
- .saveで保存する
ItemsController.rb
class ItemsController < ApplicationController
# PATCH/PUT
def update
@item = Item.find_by(id: 1)
if @item.nil?
@item = Item.new(@item_params)
@item.id = 1
if item.save
render json :@item
end
else
# 手順2での処理
end
end
手順2
- id = 1が存在していた場合、更新する
- もともと、id = 1 が存在しない場合404を返していたため、ルーティング間違った??というような感覚になったため、204を返すようにする
ItemsController.rb
class ItemsController < ApplicationController
# PATCH/PUT
def update
@item = Item.find_by(id: 1)
if @item.nil?
@item = Item.new(@item_params)
@item.id = 1
if @item.save
render json: @item
end
# 手順2で追記
elsif @item.update(@item_params)
render json: @item
else
# 204を返す
head :no_content
end
end
private
def permitted_params
params.require(:@item).permit(:description)
end
結果
Itemテーブルが空の場合、またはidカラムの中に1が存在しない場合(nullの場合)、新しくid = 1のレコードを作成することに成功。
Itemテーブルの中にid=1の行が存在していた場合、id = 1の中身を更新することに成功。
最後に
なんとかいけた