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