webアプリを作っていて、現在csvファイルを取り込む機能を実装しています。
csvファイルからデータの追加、更新はできるのですが、csv形式以外のファイルの場合はエラーを出したいです。
なかなか、実装のイメージがわかないのでご教示いただけると幸いです.....
$ rails -v Rails 5.0.0
##########ルーティングはcosts/importにpostで送られます
costs/csv.html.slim
ruby
1= form_tag costs_path, method: :post, multipart: true do 2 = file_field_tag :csv_file 3 = submit_tag 'CSV読み込み'
cost.rb
ruby
1class Cost < ActiveRecord::Base 2#csvファイルの内容をDBに登録する 3 def self.import(file) 4 imported_num = 0 5 # #文字コード変換のためにKernel#openとCSV#newを併用 6 # #参考: http://qiita.com/labocho/items/8559576b71642b79df67 7 open(file.path, 'r:cp932:utf-8', undef: :replace) do |f| 8 csv = CSV.new(f, :headers => :first_row) #エラーが出る 9 csv.each do |row| 10 next if row.header_row? 11 12 # #CSVの行情報をHASHに変換 13 table = Hash[[row.headers, row.fields].transpose] 14 15 # #登録済みデータ情報 16 # #登録されてなければ作成 17 cost = find_by(:id => table['id']) 18 if cost.nil? 19 cost = new 20 end 21 22 # #データ情報更新 23 cost.attributes = table.to_hash.slice( 24 *table.to_hash.except(:id, :created_at, :updated_at).keys) 25 26 # #バリデーションokの場合は保存 27 if cost.valid? 28 cost.save! 29 imported_num += 1 30 end 31 end 32 end 33 34 # #更新件数を返却 35 imported_num 36 end 37end
controllers/costs_controller.rb
ruby
1 def import 2 if params[:csv_file].blank? 3 redirect_to action: 'index', error: '読み込むCSVを選択してください' 4 else 5 num = Cost.import(params[:csv_file]) 6 redirect_to action: 'index', notice: "#{ num.to_s }件のデータ情報を追加/更新しました" 7 end 8 end 9
コントローラーで拡張子を判別し、処理していくのかと思っているのですが、具体的にどのコードを書いていけば良いかわかりません....
どんなことでも良いのでヒントいただけると嬉しいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/12 05:17