csvファイルを読み込んでデータベースに保存するのは、ここに一通りコードが載っている。これを参考に自分でやってみた、と。ただ、
- csvファイルをサイトにuploadする
- それが成功したら、
map.resources :imports
map.import_proc '/import/proc/:id', :controller => "imports", :action => "proc_csv"
というリダイレクトでcsvファイルを読み込むaction「proc_csv」を実行して、そこからshowにリダイレクトする、という手順が若干面倒。
ま、rails3のroutes.rbの書き方が全然わかってない、という事情もあって、imports_controllerは次のように書いた。
class ImportsController < ApplicationController
def new
@import = Import.new
end
def create
@import = Import.new(params[:import])
respond_to do |format|
if @import.save!
flash[:notice] = 'CSV data was successfully imported.'
proc_csv
else
flash[:error] = 'CSV data import failed.'
format.html { render :action => "new" }
end
end
end
def show
@import = Import.find(params[:id])
end
def index
end
def proc_csv
lines = parse_csv_file(@import.csv.path)
if lines.size > 0
@import.processed = lines.size
lines.each do |line|
new_event(line)
end
@import.save
flash[:notice] = "CSV data processing was successful."
redirect_to :action => "show", :id => @import.id
else
flash[:error] = "CSV data processing failed."
render :action => "show", :id => @import.id
end
end
private
def parse_csv_file(path_to_csv)
lines = []
require 'csv'
CSV.foreach(path_to_csv) do |row|
lines << row
end
lines
end
def new_event(line)
require 'date'
if line[4]
day = Date::new(line[0].to_i, line[1].to_i, line[2].to_i)
event=Event.new
event.start_at=day
event.name=line[4]
event.save
end
end
end
これで、
こんなcsvファイルを
こんな形でdbに保存できる、と。これが昨日一日の勉強ですな。
0 件のコメント:
コメントを投稿