Из Руководства по валидации и обратным вызовам активной записи :
Если какой-либо метод обратного вызова до возвращает точно false
или вызывает исключение, цепочка выполнения останавливается и выдается ROLLBACK [...]
Таким образом, вы можете либо позволить пузырю исключения попасть в ActiveRecord, либо вы можете перехватить его самостоятельно, перевести его во что-то, что имеет смысл в контексте вашего приложения, и вернуть false
. Вы можете регистрировать ошибки внутри обратного вызова before_save
, поэтому может иметь смысл нечто подобное:
before_save :do_magick_things
private
def do_magick_things
# ImageMagick stuff...
true
rescue ImageMagickError, FatalImageMagickError => e
errors.add(:base, 'Some sort of sensible version of e.message')
false
end
Если вы можете перевести ошибки ImageMagick во что-то, что имеет смысл для конечного пользователя, тогда ловушка и преобразование исключения ImageMagick (как в do_magick_things
), вероятно, будет иметь смысл; преобразование исключения в сообщение об ошибке также позволяет вызывающей стороне использовать save!
, если они хотят исключения, или save
, если они этого не делают.