ぺんぎんのRails日記

ぺんぎん。エンジニア経験ゼロ。Rails勉強中。

saveとsave!、destroyとdestroy!の違い

saveやdestroyには、save!やdestroy!などの破壊的メソッドがあります。

ぺんぎんを含め、初学者には、この違いは少しわかりずらいかもしれませんが、わかったところまでまとめてみたいと思います。

saveやdestroyを使う時

saveやdestroyは、処理が失敗すると想定され、失敗時に別の処理を行いたい時に使います。

def create
  @post = Post.new(post_params)
  if @post.save
    redirect_to posts_path
  else
    render :new
  end
end

上記のような新規投稿では、空のフォームが送信された時や、文字数制限に引っかかる時など、バリデーションが通らない時に処理が失敗することが想定されていますね。

そのため、save!ではなくsaveを使います。

save!やdestroy!を使う時

save!やdestroy!は必ず処理が成功すると想定される時に使います。
万が一処理が失敗する時には、例外を発生させ処理を中断させることができます。

def destroy
  @post = Post.find(params[:id])
  @post.destroy!
  redirect_to posts_path
end

通常、投稿の削除は処理が失敗することなく実行されることが想定されるため、destroy!という破壊的メソッドを使います。

例外処理については、理解が曖昧なので、追ってまとめたいと思います。