ruby on rails импортирует csv из файла загрузки в Active Records с помощью Smarter csv

Я наткнулся здесь на контрольно-пропускной пункт и мне нужна помощь. Я хочу иметь возможность импортировать CSV-файл в мою активную запись. Либо с SmarterCSV, либо каким-либо другим способом

Вот моя база

create_table "ques", force: true do |t|
    t.integer  "rikt_nr"
    t.integer  "start_nr"
    t.integer  "end_nr"
    t.datetime "created_at"
    t.datetime "updated_at"
end

вот мой взгляд

<h2>Import Ques</h2>  

<%= form_tag import_ques_path, multipart: true do %>  
   <%= file_field_tag :file %>  
   <%= submit_tag "Import" %>  
<% end %> 

вот мой маршрут

resources :ques do  
  collection { post :import }  
end  
  root to: 'ques#index' 

и мой контроллер

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

и модель

def self.import(file)  
  CSV.foreach(file.path, headers: true) do |row|  
   Que.create! row.to_hash  
  end  
end  

и CSV-файл выглядит так

Id;Rikt nr;Start nr;End nr;Created at;Updated at
1;8;4486550;4486650;October 28, 2014 08:42;October 28, 2014 08:42
2;8;4486700;4486755;October 28, 2014 08:42;October 28, 2014 08:42

Я посмотрел на все виды руководств, но я просто не могу заставить его работать.

2 ответа

Решение

Для всех, у кого есть проблемы с этим. Вот как я это решил. Прежде всего измените CSV-файл, чтобы в качестве разделителей он был ","

Затем используйте код, который у меня есть, но измените контроллер на этот

def import
      csv_file = params[:file].read
      CSV.parse(csv_file) do |row|
      ques = Que.create(rikt_nr: row[0], start_nr: row[1], end_nr: row[2])
      ques.save
    end
 redirect_to ques_path, notice: "Que added"

end

и это работает

Во-первых: вы не используете smarter_csv в вашем примере, но стандартный Ruby CSV.
Во-вторых: smarter_csv дает вам возможность указать символ-разделитель, но не auto detect Это.

в заключение вы import должен выглядеть так

def self.import(file)  
  SmarterCSV.process(file.path, col_sep: ';') do |row|  
   Que.create! row 
  end  
end  
Другие вопросы по тегам