在 Rails 中,除了验证错误之外,如何找出导致.save()失败的原因?

我有一个 ActiveRecord 模型,它从 valid?返回 true(和。错误是空的) ,但从 save()返回 false。如果模型实例是有效的,我怎样才能找出导致保存失败的原因呢?

70795 次浏览

Try using the bang version save! (with an exclamation mark at the end) and inspecting the resulting error.

If @user.save (for example) returns false, then just run this to get all the errors:

@user.errors.full_messages

Check all your callbacks.

I had a problem like this where I had and "after_validate" method that was failing after I had made a bunch of changes to the model. The model was valid but the "after_validate" was returning false, so if I used model.valid it said true, but then if I saved it gave me validation errors (passed through from the after_validate callback). It was weird.

Look at the application trace and you should be able to see what line of code is raising the exception.

Yea, I fixed this issue by making sure I return true in all my before_* callbacks then it starts working :)

The problem I had was that I had forgotten to add the validation to the model.

class ContactGroup < ActiveRecord::Base
validates_presence_of :name
end

Make sure you aren't trying to save a deleted record.

I had the same issue. But unlike the selected answer - my issue wasn't callbacks related.

In my case I had tried to save to a deleted record (deleted from DB).

@user = User.new
@user.save! # user saved to DB
@user.persisted? # true


@user.destroy # user deleted from DB
@user.persisted? # false, user still has its id


@user.valid? # return true
@user.errors # empty
@user.save # return false
@user.save! # raise ActiveRecord::RecordNotSaved