【问题标题】:Rails Parse CSV with empty cells and correctly handle exceptionsRails 使用空单元格解析 CSV 并正确处理异常
【发布时间】:2014-09-21 16:12:50
【问题描述】:

我正在尝试允许用户上传 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. 我应该在我的模型还是控制器中处理这个问题?

【问题讨论】:

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


    【解决方案1】:

    如果您有日期的存在验证,您可以仅在它们存在时分配它们,并让您的模型完成其余的工作:

    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
    

    【讨论】:

    • 抱歉,我的问题应该更具体一些。您的答案专门处理数据错误/丢失的情况,但是我试图了解如何处理一般的异常。另一个例子是空行或我们甚至无法解释的东西。如何处理此类错误,并通过例如通用的“错误数据”消息通知用户。
    • 如果发生意外 - 控制器中的简单救援块不应该足够吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多