Вчера я провел несколько тестов, и оказалось, что мое решение не совсем сработало; Я продолжал получать пустые массивы на действительных CSV-файлах после реализации первого is_valid
. Я не уверен, является ли это проблемой кэширования FasterCSV или чем-то в моем коде, и я не знаю, связано ли это с моей настройкой теста, но я решил вместо этого реализовать safe_parse
:
#/lib/faster_csv_safe_parse.rb
class FasterCSV
def self.safe_parse(file, options = {})
begin
FasterCSV.parse(file, options)
rescue FasterCSV::MalformedCSVError
nil
end
end
end
Это вернет проанализированный массив, если файл действителен, или nil
в противном случае. Затем я мог бы реализовать свои проверки следующим образом:
# /models/csv_importer.rb
class CsvImporter
include ActiveRecord::Validations
validates_presence_of :file
validate check_file_format
attr_accessor csv_data
def csv_data
@csv_data ||= FasterCSV.safe_parse(file)
end
...
private
def check_file_format
errors.add :file, "Malformed CSV! Please check syntax" if csv_data.nil?
end
end
Полагаю, можно было бы реализовать safe_parse
, который принимает блок и анализирует файл построчно, но для моих целей этой простой реализации было достаточно, и она работает во всех случаях.