我的github地址https://github.com/ParkHyunDo/ImportCsv
我正在研究如何使用roo导入excel文件。导入工作正常,但一切都是空白的。 像这样....
这是我的代码
class Product < ActiveRecord::Base
acts_as_xlsx
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(accepts_nested_attributes_for)
product.save!
end
end
def self.open_spreadsheet(file)
case File.extname(file.original_filename)
# You're using a tab seperated file, so specify seperator as a tab with \t
when ".csv" then Roo::CSV.new(file.path, csv_options: {col_sep: "\t"})
when ".xls" then Roo::Excel.new(file.path)
when ".xlsx" then Roo::Excelx.new(file.path)
else raise "Unknown file type: #{file.original_filename}"
end
end
end
def import
Product.import(params[:file])
redirect_to root_url, notice: "Products imported."
end
请帮助我!
答案 0 :(得分:1)
这条线似乎很奇怪:
product.attributes = row.to_hash.slice(accepts_nested_attributes_for)
类方法accepts_nested_attributes_for
与列出Product
的属性名称完全不同。但是你可以使用attribute_names
。试试这个:
product.attributes = row.to_hash.stringify_keys.slice(*attribute_names)
请注意,stringify_keys
可能是不必要的,具体取决于row.to_hash
返回的哈希值。另请注意,slice采用属性名称列表,而不是数组。星号*
允许我们使用数组的元素作为函数的单独参数。