У меня есть модель 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_ *, после чего он начинает работать :)