Trong ứng dụng của mình, đôi khi tôi tạo Người dùng đang bay và email của người dùng phải là định dạng hợp lệ và là duy nhất.đường ray 3.1: cách ứng dụng có thể xử lý các 'lý do' khác nhau cho ActiveRecord :: RecordInvalid (ví dụ: trùng lặp và lỗi xác thực)
Tôi muốn chuyển hướng đến các địa điểm khác nhau tùy thuộc vào việc xác thực mà gây ra lỗi được tăng lên: định dạng không hợp lệ so với trùng lặp.
Trong mã của tôi, tôi có
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
Nếu email là định dạng không hợp lệ (chẳng hạn như "user @ dụ") e.message là "Validation thất bại: Email không hợp lệ"
Nếu email đã tồn tại trong bảng, e.message là "Xác thực không thành công: Email đã được thực hiện"
Tôi ghét ý tưởng phân tích văn bản e.message để xác định lý do ... có cách nào tốt hơn cho trình xử lý cứu hộ không để phát hiện nguyên nhân cơ bản của một ngoại lệ ActiveRecord :: RecordInvalid w như ném?
P.S. Tôi biết trong ví dụ này tôi chỉ có thể kiểm tra trước email đã tồn tại trước khi thực hiện lưu, nhưng tôi đang cố gắng hiểu giải pháp chung để phát hiện và hành động trên các lỗi xác thực khác nhau ném cùng một ngoại lệ.
Trên thực tế không thể đơn giản kiểm tra trước email đã tồn tại, xác thực tính duy nhất của ActiveRecord phải tuân theo các điều kiện chủng tộc và bị phá vỡ bởi thiết kế.Bạn phải có một ràng buộc duy nhất bên trong cơ sở dữ liệu của mình và bạn phải chuẩn bị o đối phó với ngoại lệ là nó sẽ tăng (hoặc từ '.save' hoặc' .save! '). –