使用 roo-gem 解析电子表格时获取 Rails 数据库中 ActiveRecord 属性的 -nil- 值
Getting -nil- values for ActiveRecord attributes in Rails database when parsing spreadsheet using roo-gem
所以我试图在我的应用程序中构建一个功能,允许用户上传一个包含新产品的传播sheet 文件。我安装了 Roo gem。我创建了一个 link 供用户下载模板化 Google Spreadsheet 以用于将产品上传到我的应用程序。为了测试此功能,我使用此模板 sheet 上传到我的应用程序。
第一行 headers 包含在数据库中创建产品所需的属性名称。
我可以上传文件,但是,无论文件中列出多少产品,它只会上传 一个 产品。此外,导入的产品具有与文件中的属性关联的 -nil- 值。我可以通过 Rails 控制台验证这一点。
例如:
名称:无,描述:无等
这是我的 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
注意:一个电子表格有多个工作表,所以你要做的是这个
spreadsheet = open_spreadsheet(file) # this return a spreadsheet
sheet1 = spreadsheet.sheet(0) # this will return the first sheet
puts spreadsheet.sheets # show all sheets
好的,所以我遇到的问题是,在我导入的电子表格中,我的 header 行大写而不是小写。 Capacity、Threshold 和 Quantity 属性也有问题,因为它们不是产品模型的一部分。
一旦我编辑了电子表格并删除了这三个属性,它就正确导入了,没有错误。
所以我试图在我的应用程序中构建一个功能,允许用户上传一个包含新产品的传播sheet 文件。我安装了 Roo gem。我创建了一个 link 供用户下载模板化 Google Spreadsheet 以用于将产品上传到我的应用程序。为了测试此功能,我使用此模板 sheet 上传到我的应用程序。
第一行 headers 包含在数据库中创建产品所需的属性名称。
我可以上传文件,但是,无论文件中列出多少产品,它只会上传 一个 产品。此外,导入的产品具有与文件中的属性关联的 -nil- 值。我可以通过 Rails 控制台验证这一点。
例如: 名称:无,描述:无等
这是我的 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
注意:一个电子表格有多个工作表,所以你要做的是这个
spreadsheet = open_spreadsheet(file) # this return a spreadsheet
sheet1 = spreadsheet.sheet(0) # this will return the first sheet
puts spreadsheet.sheets # show all sheets
好的,所以我遇到的问题是,在我导入的电子表格中,我的 header 行大写而不是小写。 Capacity、Threshold 和 Quantity 属性也有问题,因为它们不是产品模型的一部分。
一旦我编辑了电子表格并删除了这三个属性,它就正确导入了,没有错误。