私のアプリでは、ユーザーをその場で作成することがあります。ユーザーのメールは有効な形式であり、一意である必要があります。
検証によってエラーが発生した場所に応じて、別の場所にリダイレクトしたいと思います。無効な形式と重複です。
私のコードには
begin
user.save!
flash[:notice] = "Created new user #{email} with password #{password}"
rescue ActiveRecord::RecordInvalid => e
flash[:alert] = "Failed to create account because #{e.message}"
redirect_to SOMEPLACE
end
電子メールが無効な形式(「user @ example」など)の場合、e.messageは「検証に失敗しました:電子メールが無効です」です。
電子メールがすでにテーブルに存在する場合、e.messageは「検証に失敗しました:電子メールはすでに取得されています」です。
理由を特定するためにe.messageテキストを解析するという考えは嫌いです...ActiveRecord:: RecordInvalid例外がスローされた根本的な理由をレスキューハンドラーが検出するためのより良い方法はありますか?
PSこの例では、保存を実行する前に既存の電子メールを確認するだけで済みますが、同じ例外をスローするさまざまな検証の失敗を検出して対処するための一般的な解決策を理解しようとしています。