我遇到了障碍,需要帮助。我希望能够将csv文件导入我的Active Record。使用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
我看过所有类型的指南,但我不能让它发挥作用。
答案 0 :(得分:3)
首先:您不是在示例中使用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
答案 1 :(得分:-1)
对于其他任何有此问题的人。这就是我解决它的方式。首先,将csv文件更改为&#34;,&#34;作为分隔符
然后使用我的代码,但将控制器更改为
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
并且有效