【问题标题】:How to upload correctly CSV file in Rails如何在 Rails 中正确上传 CSV 文件
【发布时间】:2019-03-07 04:28:30
【问题描述】:

我正在尝试从 Active Admin 上传带有 Rails 的 csv 文件。

我有一个模型用户,它有 name(string) 和 age(integer) 列。

我的 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 行中的非法引用。

下面写着:

部分“\”名称“
解析“\”姓名、年龄\“”
部分 ["\"姓名", "年龄\""]
未转换的零
in_extended_col 错误
csv []

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

【问题讨论】:

    标签: ruby-on-rails csv


    【解决方案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])
    

    【讨论】:

    • 它说undefined method path' for nil:NilClass` 并突出显示CSV.foreach(file_params.path, headers: true) do |row|
    • @Al-josh 你能检查哪些参数你正在获取用户上传的 csv 文件吗?可能它可能是params[:dump][:file],所以如果是这样,那么将替换 params[:file] 更改为实际文件 params ,希望你能明白。
    • 是的,那我回Illegal quoting in line 1. :(
    • @Al-josh 您使用的是哪个版本的 ruby​​?
    • stackoverflow.com/questions/9864064/… 请查看此链接,它可以解决您的问题。
    猜你喜欢
    • 1970-01-01
    • 2019-07-13
    • 2011-04-25
    • 1970-01-01
    • 2019-02-23
    • 2022-11-02
    • 2015-02-21
    • 1970-01-01
    • 2012-05-28
    相关资源
    最近更新 更多