У меня есть модель ActiveRecord, которая возвращается true
из valid?
(и .errors пуста), но возвращается false
из save()
. Если экземпляр модели действителен, как я могу узнать, что вызывает сбой при сохранении?
У меня есть модель ActiveRecord, которая возвращается true
из valid?
(и .errors пуста), но возвращается false
из save()
. Если экземпляр модели действителен, как я могу узнать, что вызывает сбой при сохранении?
Ответы:
Проверьте все ваши обратные вызовы.
У меня была такая проблема, когда у меня был метод after_validate, который не работал после того, как я внес кучу изменений в модель. Модель была действительна, но «after_validate» возвращало false, поэтому, если я использовал model.valid
ее, говорило «истина», но затем, если я сохранил, это дало мне ошибки проверки (переданные из обратного вызова after_validate). Это было странно.
Посмотрите на трассировку приложения, и вы сможете увидеть, какая строка кода вызывает исключение.
"Hey! That's MY fake leg!" # Believe it or not, this is important
. Не то чтобы я так поступил. ;)
true.tap { do_something }
Попробуйте использовать версию Bang save!
(с восклицательным знаком в конце) и проверьте полученную ошибку.
save!
может поднять ActiveRecord::RecordInvalid
(поскольку он выполняет проверки), или ActiveRecord::RecordNotSaved
это то, что вы хотите спасти.
.save
сбои, не связанные с проверкой. Квалификация «наименее неудовлетворительная» относится к Rails, а не к этому ответу.
Если @user.save
(например) возвращается false
, просто запустите это, чтобы получить все ошибки:
@user.errors.full_messages
Да, я исправил эту проблему, убедившись, что возвращаю true во всех моих обратных вызовах before_ *, после чего он начинает работать :)