LoginSignup
2
0

【Rails】フロントから指定したidが返ってこなかった場合、バックエンドで新しいidを作成してレコードを作成する

Last updated at Posted at 2023-07-10

*見習いエンジニア向けです

こちらの記事の方が簡潔で短く書けます。

やること

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の中身を更新することに成功。

最後に

なんとかいけた

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0