Rails で #create した際に ROLLBACK が出た場合の理由が知りたい(デバッグしたい、エラーログが見たい)とき

結論

以下の2つのどちらかの方法を使いましょう*1

方法1. #new してから valid? で検証し、#errors でログを出す

#create をいきなり使うと、エラーがなかった場合には実際にレコードが作られてしまうので、通常はこちらを使うといいと思います。

以下、users というテーブルにレコードを作成する場合を例にします。作成の際に email: 'foobar@example.com' というように email カラムに値を指定します。しかし、「passwordpassword_confirmation にも値が必要である」という理由でレコードが正しく作成されない状況を想定しています。

また、以下は pry 上での操作です。

> user = User.new(email: 'foobar@example.com')
(省略)
> user.valid?
=> false
> user.errors
(省略)
 @messages=
  {:password=>["can't be blank"],
   :password_confirmation=>["can't be blank"]}>

方法2. #create してから logger でログを出す

いざ #create したら ROLLBACK された場合、以下の方法でもよいでしょう*2

> user = User.create(email: 'foobar@example.com')
(省略)
   (0.1ms)  rollback transaction
> Rails.logger.debug(user.errors)
(省略)@messages={:password=>["can't be blank"], :password_confirmation=>["can't be blank"]}, (後略)

*1:他にもあると思います

*2:ただ、正常に #create されると実際にレコードが作成されることには注意です

Powered by はてなブログ