じぶんメモ

プログラミングのメモ、日常のメモとか。

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を使用しないと、インスタンス変数が初期化されるため、
エラーメッセージを拾うことができない。