Rails使用空单元格解析CSV并正确处理异常

时间:2014-07-30 05:57:47

标签: ruby-on-rails ruby csv ruby-on-rails-4

我正在尝试允许用户上传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_dateorder_date缺失;我得到no implicit conversion of nil into String,因为我试图解析空单元格的日期。尽管我的模型中存在验证,但它们只会被save动作触发。

我不想使用rescue块静默忽略这些错误,而是重定向回来,并通知用户。

  1. 如何处理此类异常,以便作业失败,并且用户会收到错误通知,而不仅仅是上面给出的错误,但包括我们无法解释的错误?另一个例子是空行或我们甚至无法解释的事情。如何处理此类错误,并通知用户,例如,通用"错误数据"消息?
  2. 我应该在我的模型或控制器中处理这个吗?

1 个答案:

答案 0 :(得分:0)

如果你有日期的在线验证,你可以只在它们存在的情况下分配它们,并让你的模型完成剩下的工作:

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