ActiveRecordのメソッドに「!」がついた時とそうでない時の挙動の違い

こんにちは!kossyです!




さて、今回は、ActiveRecordのメソッド(create, update, destroy, save)に!が付いている時と
そうでない時の挙動の違いについて、ブログに残してみたいと思います。




例外を起こすか否か

端的にまとめると、上記になります。

「!」を伴うメソッドは、バリデーションの失敗時に例外を起こし、動作を終了します。
対して、「!」を伴わないメソッドは、バリデーションに失敗しても、例外を起こさずに動作を継続させます。



トランザクション処理を行いたいとき


例えば、ActiveRecord.transaction メソッドを使うときは、ブロック内でcreateやsaveをする場合、

ActiveRecord::Base.transaction do
  @hoge.save!
end

というように、!をつけて例外を起こすようにします。
transactionは例外処理に反応してロールバックするので、!をつけて例外を起こさせるようにするわけです。



まとめ

・!の有無は、バリデーションの失敗時に例外を起こすか否か
・!が付いていれば例外を起こす
・なければ起こさない
トランザクション処理のブロック内では!を付ける




参考にさせていただいた記事

rails のtransaction処理 - Qiita
rails save! create! update!のバリデーション例外を捕捉する - Qiita