Railsでデータベースへの登録あれこれ
データベース登録サンプル。
* saveメソッド:登録成功時にtrue、失敗時にfalseを返却する。
* save!メソッド:登録失敗時に例外を返却する。
普通に登録する分にはsaveメソッドで問題ないが、
他テーブルも兼ねたトランザクションでのロールバックをする場合は、
transactionメソッドとともにsave!メソッドで例外を拾い、ロールバックをさせる、
といった使い分けができる。
(railsでは例外が発生しない場合は明示的にロールバックをさせる必要がある。)
saveメソッドの例
def create @live_house = LiveHouse.new(live_house_params) if @live_house.save then # 成功時に一覧画面へ遷移 redirect_to live_houses_path else # 失敗時は新規登録画面に戻す render new_live_house_path @live_house end end
save!メソッドの例
def create @live_house = LiveHouse.new(live_house_params) begin LiveHouse.transaction do @live_house.save! end # 主キーエラー rescue ActiveRecord::RecordNotUnique => e @live_house = e.record # renderにしないと、インスタンス変数が初期化されるため、エラーメッセージが残らない render new_live_house_path @live_house # バリデーションエラー rescue ActiveRecord::RecordInvalid => e @live_house = e.record render new_live_house_path @live_house end end
save!メソッドを使用するときの注意としては、
エラー発生時のレコードは、キャッチした例外.recordで拾う必要がある。
また、エラー発生時に新規登録画面に戻す際は、
redirect_toではなくrenderを使用しないと、インスタンス変数が初期化されるため、
エラーメッセージを拾うことができない。