В рельсах, как я могу узнать, что привело к ошибке .save(), кроме ошибок проверки?

У меня есть модель ActiveRecord, возвращающая true из valid? (и .errors пуст), но возвращает false из save(). Если экземпляр модели действителен, как я могу узнать, что вызвало сбой сохранения?

Ответ 1

Проверьте все ваши обратные вызовы.

У меня возникла такая проблема, когда у меня был и метод after_validate, который был неудачным после того, как я сделал кучу изменений в модели. Модель была действительна, но "after_validate" возвращал false, поэтому, если я использовал model.valid, он сказал true, но затем, если бы я ее сохранил, он дал мне ошибки проверки (прошедшие после обратного вызова after_validate). Это было странно.

Посмотрите на трассировку приложения, и вы сможете увидеть, какая строка кода создает исключение.

Ответ 2

Попробуйте использовать версию bang save! (с восклицательным знаком в конце) и проверите полученную ошибку.

Ответ 3

Если @user.save (например) возвращает false, просто запустите его, чтобы получить все ошибки:

@user.errors.full_messages

Ответ 4

Да, я исправил эту проблему, убедившись, что возвращаю true во всех моих обратных вызовах before_ *, после чего он начинает работать:)

Ответ 5

Проблема была в том, что я забыл добавить валидацию к модели.

class ContactGroup < ActiveRecord::Base
  validates_presence_of :name
end

Ответ 6

Энди <record>.new(<data>).save! рекомендация сработала для меня