昨日、いくつかのテストを行ったところ、私のソリューションがうまく機能しないことがわかりました。最初の を実装した後、有効な CSV で空の配列を取得し続けましたis_valid
。それが FasterCSV キャッシングの問題なのか、コード内の何かなのかはわかりません。また、それがテスト セットアップに関連しているかどうかもわかりませんが、safe_parse
代わりにa を実装することにしました。
#/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
ブロックを受け入れてファイルを 1 行ずつ解析するを実装することは可能だと思いますが、私の目的には、この単純な実装で十分であり、すべての場合に機能します。