FasterCSVを試す

  • active_scaffoldの環境を作る

$ rails --database=mysql csv_test
$ cd csv_test
$ git clone git://github.com/activescaffold/active_scaffold.git vendor/plugins/active_scaffold && rm -rf vendor/plugins/active_scaffold/.git
$ script/generate model user user_id:string name:string age:integer post:string address:string tel:string
$ rake db:create
$ rake db:migrate

  • ファイルの形式
    • import_user.csv

"address","age","name","post","tel"
"address1","10","Taro","123","456"
"address2","20","Hanako","456","789"

    • export_user.csv

address,age,name,post,tel
address1,10,Taro,123,456
address2,20,Hanako,456,789

  • Controllerの編集
    • リンクのボタン(#6-#10)
    • ヘッダの読み飛ばし、改行の扱い環境依存(#14)
    • app/controllers/users_controller.rb

1 class UsersController < ApplicationController
2 # require "csv"
3 require "fastercsv"
4
5 layout "user"
6 active_scaffold :user do | config |
7 config.action_links.add 'import_csv', :label => 'Import CSV', :page=> true
8 config.action_links.add 'export_csv', :label => 'Export CSV', :page=> true
9 config.action_links.add 'delete_all', :label => 'Delete All', :page=> true
10 end
11
12 def import_csv
13 csv_file = "import_user.csv"
14 csv_options = { :headers => true, :col_sep => ",", :row_sep => "\n" }
15 FasterCSV.foreach(csv_file, csv_options ) do | row |
16 @user = User.new
17 @user[:address] = row['address']
18 @user[:age] = row['age']
19 @user[:name] = row['name']
21 @user[:tel] = row['tel']
22 # @user[:address] = row[0]
23 # @user[:age] = row[1]
24 # @user[:name] = row[2]
25 # @user[:post] = row[3]
26 # @user[:tel] = row[4]
27 @user.save
28 end
29 redirect_to(:action => 'index')
30 end
31
32 def export_csv
33 csv_file = "export_user.csv"
34
35 FasterCSV.open(csv_file, "w") do |csv|
36 csv << ["address", "age", "name", "post", "tel"]
37 User.find(:all).each do | user |
38 # csv << ["1", "2", "3", "4", "5"]
39 csv << [user.address, user.age, user.name, user.post, user.tel ]
40 end
41 end
42 redirect_to(:action => 'index')
43 end
44
45 def delete_all
46 User.delete_all
47 redirect_to(:action => 'index')
48 end
49 end

  • Viewsの編集
    • app/views/layouts/user.html.erbの新設





User: <%= controller.action_name %>
<%= javascript_include_tag :defaults %>
<%= active_scaffold_includes %>


<%= flash[:notice] %>

<%= yield %>