我试图让用户上传csv文件,但是我有一些问题试图找出如何处理文件本身的错误。
控制器方法:
def create
Product.import_csv(file)
redirect_to products_path, :flash => { :notice => "Items Added!" }
end
导入文件的模型方法:
def self.import_csv(file)
csv = CSV.read(file.path), :headers => true)
csv.each do |row|
item_id = row[0]
start_date = Date.parse(row[1])
order_date = Date.parse(row[2])
new_rec = where(item_id:item_id, order_date:order_date).first_or_initialize
new_rec.save!
end
end
当文件格式正确时,所有这些都工作得很好,但是我对如何处理异常感到困惑。一旦出现start_date
或order_date
缺失的例外情况;我得到一个no implicit conversion of nil into String
,因为我试图解析一个空单元格的日期。尽管我的模型中有存在验证,但它们只在save
操作时被触发。
我不想用rescue
块静默地忽略这些错误,而是重定向返回,并通知用户。
- 我如何处理这样的异常,使作业失败,用户得到错误的通知,不只是上面给出的错误,但包括我们无法解释的错误?另一个例子是空行或我们甚至无法解释的东西。如何处理这类错误,并用通用的"坏数据"消息通知用户?
- 我应该在我的模型或控制器处理这个吗?
如果您有日期的存在验证,您可以简单地只在它们存在时分配它们,并让您的模型完成其余的工作:
def self.import_csv(file)
csv = CSV.read(file.path), :headers => true)
csv.each do |row|
item_id = row[0]
start_date = row[1].nil? ? nil : Date.parse(row[1])
order_date = row[2].nil? ? nil : Date.parse(row[2])
new_rec = where(item_id:item_id, order_date:order_date).first_or_initialize
new_rec.save!
end
end