rails导入csv文件,但保存为空

时间:2017-03-26 18:42:40

标签: ruby-on-rails ruby csv

我的github地址https://github.com/ParkHyunDo/ImportCsv

我正在研究如何使用roo导入excel文件。导入工作正常,但一切都是空白的。 像这样....

enter image description here

这是我的代码

product.rb

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

products_controller.rb

def import
  Product.import(params[:file])
  redirect_to root_url, notice: "Products imported."
end

请帮助我!

1 个答案:

答案 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采用属性名称列表,而不是数组。星号*允许我们使用数组的元素作为函数的单独参数。