#はじめに
rails学習中にXXX.save!
と記載されたコードを確認し、
普段書いているXXX.save
との違いが気になったためまとめました。
#結論
XXX.save
:通常のメソッド 成功時⇒保存 失敗時⇒falseを返す
XXX.save!
:破壊的メソッド 成功時⇒保存 失敗時⇒例外を返す
例えばOrderモデルのtotal_priceに0円より大きい値のみ許可を与えている場合
以下の挙動を示す
[3] pry(main)> order=Order.new
(0.6ms) SELECT sqlite_version(*)
TRANSACTION (0.0ms) begin transaction
=> #<Order:0x000000012ee09aa0 id: nil, total_price: 0, created_at: nil, updated_at: nil>
[4] pry(main)> order.save
=> false
[5] pry(main)> order.save!
ActiveRecord::RecordInvalid: Validation failed: Total price must be greater than 0
#save!のメリット
- 失敗時にエラーが発生し、原因が追求しやすい
- 例外が発生することで、処理が止まる