Как правильно загрузить CSV-файл в Rails - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь загрузить CSV-файл с помощью Rails из Active Admin.

У меня есть модель User, в которой есть столбцы 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.

И ниже этозаписано:

часть "\" name "
синтаксический анализ" \ "name, age \" "
parts [" \ "name", "age \" "] *
без преобразования nil
in_extended_col false
csv []

Я проверил множество примеров и не могу найти ошибку. Возможно, мой CSV-файл отформатирован неправильно.

1 Ответ

0 голосов
/ 02 октября 2018
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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...