Note khi làm tính năng import file lên hệ thống để lưu data:
Kiểm tra file phải đúng định dạng ở controller. VD: đuôi phải là csv, excel nếu không sẽ báo lỗi
if params[:file].original_filename.split(".").last == Settings.export.format.csv status, message = ImportService.import_csv(params[:file]) else status, message = [false, "File khong phai csv"]
end
Tiếp đến Bắt lỗi ở file import:
- Kiểm tra có đọc được file theo định dạng mong muốn k? nếu k đúng định dạng thì báo lỗi luôn. VD: file encoding là gì?, có header ...
begin csv = CSV.read(file.path, headers: true, encoding: jis_encoding) rescue StandardError return [false, @i18n_message[:invalid_encode]] end
- Nếu file có header : tên các cột thì cần kiểm tra có đủ cột hay k? tên cột có đúng k?
return [false, @i18n_message[:invalid_file]] if csv.headers != i18n_export[:label_name].values
- Sau đến mới xử lý chạy từng row và lấy data, Kiểm tra validate. nếu validate lỗi thì gom nó vào 1 mảng lưu các dòng lỗi, nội dung lỗi. Hiển thị lỗi theo dòng:
"<li>Dong #{$INPUT_LINE_NUMBER}: #{errors.join('')}"
thay vì foreach từng row rồi tạo lưu luôn vào DB thì sẽ foreach từng row, khởi tạo object cho vào 1 mảng
Sau đó dùng gem "activerecord-import" để import 1 lần vào CSDL