1

所以我试图在我的应用程序中构建一个功能,允许用户上传一个包含新产品的电子表格文件。我安装了 Roo gem。我为用户创建了一个链接,以下载模板化的 Google 电子表格,用于将产品上传到我的应用程序。出于测试此功能的目的,我正在使用此模板表格上传到我的应用程序。

第一行标题具有在数据库中创建产品所需的属性名称。

我可以上传文件,但是,无论文件中列出了多少产品,它只会上传一种产品。此外,导入的产品具有与文件中的属性关联的 -nil- 值。我可以通过 Rails 控制台验证这一点。

例如:名称:nil,描述:nil 等。

这是我的 Product.rb 文件中的相应代码:

def self.import(file)
    spreadsheet = open_spreadsheet(file)
    header = spreadsheet.row(1)
    (2..spreadsheet.last_row).each do |i|
      row = Hash[[header, spreadsheet.row(i)].transpose]
      product = find_by_id(row["id"]) || new
      product.attributes = row.to_hash.slice(*accessible_attributes)
      product.save!
    end
end

def self.accessible_attributes
   ['name', 'description', 'category', 'barcode', 'quantity', 
   'capacity', 'threshold']
end

def self.open_spreadsheet(file)
  case File.extname(file.original_filename)
  when ".csv" then Roo::Csv.new(file.path, file_warning: :ignore)
  when ".xls" then Roo::Excel.new(file.path, file_warning: :ignore)
  when ".xlsx" then Roo::Excelx.new(file.path, file_warning: :ignore)
  else raise "Unknown file type: #{file.original_filename}"
  end
end

这就是我的路线设置方式:

resources :products do
   collection { post :import }
end
4

2 回答 2

2

好的,所以我遇到的问题是,在我导入的电子表格上,我将标题行大写而不是小写。容量、阈值和数量属性也存在问题,因为它们不属于产品模型。

一旦我编辑了电子表格并删除了这三个属性,它就可以正确导入而没有错误。

于 2017-06-08T21:44:45.303 回答
0

注意:一个电子表格有多个工作表,所以你想要做的是这个

spreadsheet = open_spreadsheet(file) # this return a spreadsheet
sheet1 = spreadsheet.sheet(0) # this will return the first sheet
puts spreadsheet.sheets # show all sheets
于 2017-06-06T11:47:50.130 回答