簡體   English   中英

在Rails中對csv上傳進行錯誤處理

[英]Error handling of csv upload in rails

我的活動記錄中有此導入方法,用於導入csv文件。 我想知道如何在活動記錄中對此進行錯誤處理。

class SheetEntry < ActiveRecord::Base
  unloadable

  belongs_to :user
  belongs_to :project
  belongs_to :task
  validate :project_and_task_should_be_active

  def self.import(csv_file)
    attributes = [:user_id, :project_id, :task_id, :date, :time_spent, :comment]
    errors=[]
    output = {}
    i=0
    CSV.foreach(csv_file, headers: true, converters: :date).with_index do |row,j|
      entry_hash= row.to_hash
      entry_hash['Project'] = SheetProject.where("name= ?" , entry_hash['Project']).pluck(:id)
      entry_hash['Task'] = SheetTask.where("name= ?" , entry_hash['Task']).pluck(:id)
      entry_hash['Date'] =  Time.strptime(entry_hash['Date'], '%m/%d/%Y').strftime('%Y-%m-%d')
      entry_hash['Time (Hours)'] = entry_hash['Time (Hours)'].to_f
      firstname = entry_hash['User'].split(" ")[0]
      lastname = entry_hash['User'].split(" ")[1]
      entry_hash['User'] = User.where("firstname=? AND lastname=?",firstname,lastname).pluck(:id)
      entry_hash.each do |key,value|
        if value.class == Array
          output[attributes[i]] = value.first.to_i
        else
          output[attributes[i]] = value
        end
        i += 1
      end
      entry=SheetEntry.new(output)
      entry.editing_user = User.current
      entry.save!
    end      
  end


  def project_and_task_should_be_active
    errors.add(:sheet_project, "should be active") unless  sheet_project.active?
    errors.add(:sheet_task, "should be active") if sheet_task && !sheet_task.active?
  end
end  

我想知道如果為entry_hash['Project']entry_hash['Task']或csv中的任何字段返回了nil對象,則如何顯示錯誤。

例如:如果用戶輸入了錯誤的項目,錯誤的任務或錯誤的日期。 我希望錯誤與行號一起顯示,並停止csv的上傳。 有人可以幫忙嗎?

您可以使用beginrescue語句來處理任何ruby類中的錯誤。

您可以使用rescue塊將Exception e返回給調用方。 但是,你不能叫errors.add方法添加錯誤,因為#errors是一個實例方法是不是類方法中訪問self.import

def self.import(csv_file)
  begin
    attributes = [:user_id, :project_id, :task_id, :date, :time_spent, :comment]
    errors=[]
    output = {}
    i=0
    CSV.foreach(csv_file, headers: true, converters: :date).with_index do |row,j|
      ...
    end
  rescue Exception => e
    return "Error: #{e}"
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM