前提・実現したいこと
お世話になります。
初投稿です。いろいろご指摘いただけるとありがたいです。
宜しくお願いします。
現在、Ruby on Railsにてwebアプリを開発しております。
ブラウザからCSVファイルを選択して、データをDBにインポートしたいと考えています。
発生している問題・エラーメッセージ
エラーにはなるのですが、エラー原因はわかっています。
CSVファイルの先頭列(Pkey)だけが作成されるInsert文に設定されず、Insertでキー無しでエラーになっています。
質問したいのは、なぜCSVファイルの先頭列の値が設定されないのか。
どうしたら先頭列の値が設定できるのか、ということです。
該当のソースコード
インポートの設定は以下です。
**[app/models/itemmastertest.rb]** class Itemmastertest < ApplicationRecord def self.item_attributes ["itemid","item_name","item_color","abo_flag","remarks","created_at","updated_at"] end def self.import(file) CSV.foreach(file.path, headers:true) do |row| itemmastertest = new itemmastertest.attributes = row.to_hash.slice(*item_attributes) itemmaster.save! end end end **[config/application.rb]** require 'csv' **[app/views/index.html.slim]** = form_tag import_itemmastertests_path, multipart: true, class: 'mb-3' do = file_field_tag :file = submit_tag "インポート", class: 'btn btn-info' **[app/controllers/itemmastertests.controller.rb]** def import Itemmastertest.import(params[:file]) redirect_to itemmastertests_url, notice: "インポート完了!" end
試したこと
csvファイルを読み込むmodelで値が設定されているか検証しました。
foreachの繰り返しの部分で値が設定されているのかを確認しました。
puts row[0]
→ E100
rowの添え字0には値が設定されていました。
puts Itemmastertest.attributes
→ {"id"=>nil, "itemid"=>nil, "item_name"=>"商品1", "item_color"=>"90", "abo_flag"=>true, "remarks"=>nil, "created_at"=>Tue, 08 Jan 2019 00:00:00 UTC +00:00, "updated_at"=>Tue, 08 Jan 2019 00:00:00 UTC +00:00}
上記"id"=>nil はrailsで自動設定される認識ですので問題ないと思っています。
csvファイルの先頭列のitemidには値が設定されていませんでした。
DBのテーブル(model)を再作成し、別のカラムを先頭列にしてみた。
→同じ現象になり、先頭列の値が設定されませんでした。
補足情報(FW/ツールのバージョンなど)
以下、実行環境です。
OS
Windows10 64bit
ruby -v
ruby 2.5.3p105 (2018-10-18 revision 65156) [x64-mingw32]
rails version
Rails 5.2.2
DB
psql (PostgreSQL) 11.1
回答2件
あなたの回答
tips
プレビュー