当处理文件before_save时出错,验证后,我应该引发异常还是返回false并添加错误?

Zeq*_*uez 4 ruby error-handling exception-handling ruby-on-rails conventions

例如,如果我有一个传递所有验证的图像,例如尺寸,尺寸,类型等,但是当我必须处理它时,由于某种未知的原因,ImageMagick无论如何都会抛出一个错误...我应该如何处理?

mu *_*ort 13

来自Active Record Validations和Callbacks Guide:

如果回调方法之前有任何返回方法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
Run Code Online (Sandbox Code Playgroud)

如果你可以将ImageMagick错误翻译成对最终用户有意义的东西,那么捕获和翻译ImageMagick异常(如同do_magick_things)可能会最有意义; 将异常转换为错误消息还允许调用者在save!需要异常时使用,或者save如果他们不需要异常.