窓際BLOG

プログラミングの学習メモや書籍の感想等を公開していきます。

RubyonRails:登録時にRollbackされる原因がわからない時の対処法

model.saveの際になぜか TransactionがRollbackされ原因調査でハマったのでメモφ(..)

対処法

model.save!で登録を行ってみる。 model.saveの返り値は、true/falseのため、どのようなエラーが発生しROLLBACKされているかはわからない。 しかし、model.save!では、ActiveRecordの例外を返してくれるため、原因調査に役立つ。

実際の結果

[2] pry(#<MessagesController>)> @message.save
   (0.1ms)  begin transaction
  Message Exists (0.3ms)  SELECT  1 AS one FROM "messages" WHERE "messages"."body" = 'ああああ' LIMIT 1
  Message Exists (0.2ms)  SELECT  1 AS one FROM "messages" WHERE "messages"."conversation_id" = 1 LIMIT 1
  Message Exists (0.2ms)  SELECT  1 AS one FROM "messages" WHERE "messages"."user_id" = 2 LIMIT 1
   (0.1ms)  rollback transaction
=> false
[3] pry(#<MessagesController>)> @message.save!
   (1.3ms)  begin transaction
  Message Exists (0.8ms)  SELECT  1 AS one FROM "messages" WHERE "messages"."body" = 'ああああ' LIMIT 1
  Message Exists (0.3ms)  SELECT  1 AS one FROM "messages" WHERE "messages"."conversation_id" = 1 LIMIT 1
  Message Exists (0.4ms)  SELECT  1 AS one FROM "messages" WHERE "messages"."user_id" = 2 LIMIT 1
   (0.1ms)  rollback transaction
ActiveRecord::RecordInvalid: Validation failed: Conversation has already been taken, User has already been taken

こんな感じでエラーの原因を確認出来る。

参考にしたページ

d.hatena.ne.jp