У меня есть модель ActiveRecord, которая возвращается true
из valid?
(и .errors пуста), но возвращается false
из save()
. Если экземпляр модели действителен, как я могу узнать, что вызывает сбой при сохранении?
91
У меня есть модель 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_ *, после чего он начинает работать :)
источник
Проблема заключалась в том, что я забыл добавить проверку к модели.
class ContactGroup < ActiveRecord::Base validates_presence_of :name end
источник