Öncelikle sorunumu anlatıp kodumu paylaşmak istiyorum. Elimde xlsx uzantılı bir dosya var ve hali hazırda bu dosyaları Roo gem i ile okuyabiliyorum. Ama bugün karşılaştığım case de elimdeki xlsx dosyasını okurken invalid value for Integer(): "" hatası aldım. Amacım excelde bulunan ilk sayfadaki ilk satırın varlığını kontrol etmekti. Kodum:
def read_excel
spread_sheet = Roo::Spreadsheet.open(file_path).sheet(0)
if spread_sheet.first_row.blank? # throws the error (invalid value for Integer(): "")
fail Errors::ExcelImport::EmptyFile
end
spread_sheet
end
Sürekli olarak aynı hatayı almaya devam ettim ama sayfa ismini değiştirdiğimde hatanın ortadan kalktığını farkettim. Araştırdığımda ise Roo gem i için açılmış bir issue ya rastladım.
Issue: https://github.com/roo-rb/roo/issues/478
Gem i update etsemde yaşadığım problem düzelmedi. Eğer sorun gem kaynaklı ise sistemimde bunu nasıl handle etmeliyim? Veya sorun kodum kaynaklı ise hatam nerede olabilir ?
Emin olmak için Integer() çağırıldığı yerin hemen üstüne binding.pry koysanız ve emin olsanız sorunun ordan kaynaklandığından. Ondan sonra bekli ona göre bir çözüm üretilebilir. Bu arada gem dosyasında değişiklik yaptıktan sonra rails server veya consolu yeniden başlatmanız gerekir.
numberın değeri boş string olduğu zaman bu methodun ne döndürmesini beklersiniz?
create_numeric methodunun içinde 20 satırdan sonra şöyle bir kod eklediğinizde beklediğiniz çıktıyı alıyor musunuz?
if number.respond_to?(:blank?) && number.blank?
# buraya da number'ın blank olması durumunda döndürmek istediğiniz
# değer, `0` veya `nil` veya `number` olabilir?
return number
end
Ya da Excelx::ERROR_VALUES'a boş string’i mi eklesek, emin olmadım
Bunu deneyeceğim sonucu yazıyor olacağım sistemde şöyle bir çözüm buldum hızlıca yazmak istedim:
def read_excel
spread_sheet = Roo::Spreadsheet.open(file_path).sheet(0)
begin
if spread_sheet.first_row.blank?
fail Errors::ExcelImport::EmptyFile
end
spread_sheet
rescue StandardError
fail Errors::ExcelImport::InvalidSheetName
end
end
Hata gem kaynaklı olduğu için böyle bir durum oluşması durumunda yeni bir error oluşturdum ve kullanıcıya sayfa isim hatası çıkardım. Sayfa ismi editlendiğinde hata ortadan kalkıyor