!をつけるとつけないとでは何が違うのか?

よく使われるメソッドでcreatesaveなどがあります。これらの処理を実行しレコードの作成、保存に失敗した際、通常の場合はnilを返します。

しかし、create!save!のようにをつけることによりActiveRecord::RecordNotFoundエラーを発生させることができます。

つまりを付ける付けないの違いは例外を発生させるか発生させないかの違いです。


create!save! → レコードの作成・保存に失敗 → 例外を発生させる createsave → レコードの作成・保存に失敗 → nilを返す


saveメソッドの場合は保存の成功と失敗を true/false で返すのに対して、save!メソッドは保存を失敗した場合に例外を返します。つまり、save!を使えば例外をトリガーにしてロールバックなどの処理を行うことができるため、比較的使用頻度が高いかと思います。

補足:そもそも例外処理とは?

プログラムがある処理を実行している途中で、なんらかの異常が発生した場合に、現在の処理を中断(中止)して、別の処理を行うこと。その際に発生した異常のことを例外と呼ぶ

つまり、プログラムがすんなり通らなかったときに行う処理のことを指します。理想とは違う処理が例外という解釈でもいいと思います。

まとめ