如何在Rails中正确上传CSV文件

时间:2018-10-02 03:32:29

标签: ruby-on-rails csv

我正在尝试从Active Admin使用Rails上传一个csv文件。

我有一个用户模型,其中有列name(字符串)和age(整数)。

我的csv文件如下:

name,age
"Peter",31
"Susan",30
"John",40

然后我进入admin/user.rb

ActiveAdmin.register User do
  permit_params :name, :age

  collection_action :upload_csv do
    render "admin/csv/upload_csv_user"
  end

  collection_action :import_csv_data_user, :method => :post do
    ret_val = CsvDb.update_model_from_csv("user", params[:dump][:file])
    redirect_to :action => :index, :notice => ret_val
  end
end

在我的admin/csv/upload_csv_user.html.erb中,我有:

<%= form_for(:dump, :url=>{:action=>"import_csv_data_user"}, :html => { :multipart => true }) do |f| %>
  <%= f.file_field :file %>
  <%= f.submit "Submit", confirm: "Are You Sure?" %>
<% end %>

我在一个csv_db.rb文件中

require 'csv'
module CsvDb

  def self.update_model_from_csv(model_name, file)
    csv_data = CSV.read(file.path)
    columns = csv_data.shift
    model = model_name.classify.constantize
    ret_val = "Data updated successfully!"
    begin
      model.import columns, csv_data, on_duplicate_key_update: columns, validate: false
    rescue Exception => e
      ret_val = e
    end
    ret_val
  end
end

当我尝试上传文件时,出现以下错误:第1行中的引用非法。

下面写着:

“ \”部分的名称
解析“ \”名称,年龄\“”
零件[“ \”名称“,”年龄\“”]
未转换的nil
in_extended_col false
csv []

我检查了很多示例,但找不到错误。也许我的csv文件格式不正确。

1 个答案:

答案 0 :(得分:1)

require 'csv'
module CsvDb

  def self.update_model_from_csv(model_name, file_params)
    CSV.foreach(file_params.path, headers: true) do |row|
      model = model_name.classify.constantize
      begin
        name = row["name"]
        age = row["age"]
        if model.create(name: name, age: age)
          result = "Imported successfully!"
        end
      rescue Exception => e
        result = e
      end
    end
    result
  end
end

在控制器中将此方法用作:-

#pass model name and params[:file], which is csv uploaded from user end
CsvDb.update_model_from_csv(model_name, params[:file])