代码之家  ›  专栏  ›  技术社区  ›  Tom Bom

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

  •  1
  • Tom Bom  · 技术社区  · 6 年前

    我试图上传一个csv文件与Rails从活跃的管理员。

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

    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行。



    零件[“\”名称“,”年龄\“]
    未转换零
    扩展列错误
    csv[]

    我查了很多例子,找不到错误。可能我的csv文件格式不正确。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Anand    6 年前
    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])