4

たとえば、大きさ、寸法、型などのすべてのバリデーションを渡した画像がありますが、それを処理しなければならない時には、何か不明な理由でImageMagickがエラーをスローします...どうすればいいですかそれを処理する? Active Record Validations and Callbacks Guideからファイルbefore_saveの処理中にエラーが発生した場合、検証後に例外を発生させるか、falseを返してエラーを追加する必要がありますか?

答えて

12

任意の前にコールバックメソッドが正確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 

あなたは、トラップとdo_magick_thingsのようにImageMagickの例外を(翻訳エンドユーザーに理にかなって何かにImageMagickのエラーを翻訳することができた場合おそらく最も理にかなっているだろう。例外をエラーメッセージに変換する場合は、例外が必要な場合はsave!、使用しない場合はsaveを使用することもできます。

+0

「before_save」にエラーを追加するのは「アンチパターン」ではありません。知っておいて、ありがとう。 – Zequez

+0

@Zequez:私はそれがアンチパターンではないと思っています。あなたの 'before_save'をバリデーションに使用しないでください。 –

+0

私は知っていますが、なんらかの理由でエラーオブジェクトが検証エラーのために使用されるべきであると感じています。 – Zequez

関連する問題