前提・実現したいこと
rubyでcsvファイルをインポートして一括でユーザー登録したいです
csvついてどうしても分からず質問致します。申し訳ないのですがご教授頂けないでしょうか。。
初めてcsvインポートを実装と言う事で以下のサイトを参考に全く同じコードを記述しました。
参考文献
googleスプレットシートからcsvファイルを作成し、indexページからファイルを選択し、インポートしようとした際に以下のエラーが出ます。
発生している問題・エラーメッセージ
Invalid byte sequence in UTF-8 in line 1.
該当のソースコード
index.html.erb
1index.html.erb 2 3 4<h1>ユーザー一覧</h1> 5 6<table> 7 <thead> 8 <tr> 9 <th>ID</th> 10 <th>名前</th> 11 <th>年齢</th> 12 </tr> 13 </thead> 14 15 <tbody> 16 <% @users.each do |user| %> 17 <tr> 18 <td><%= user.id %></td> 19 <td><%= user.name %></td> 20 <td><%= user.age %></td> 21 </tr> 22 <% end %> 23 </tbody> 24</table> 25 26<%= form_tag import_users_path, multipart: true do %> 27 <%= file_field_tag :file %> 28 <%= submit_tag "インポート" %> 29<% end %>
index.html.erb
1class UsersController < ApplicationController 2 3 def index 4 @users = User.all 5 end 6 7 def import 8 # fileはtmpに自動で一時保存される 9 User.import(params[:file]) 10 redirect_to users_url 11 end 12end
index.html.erb
1class User < ApplicationRecord 2 3 require 'csv' 4 5 def self.import(file) 6 CSV.foreach(file.path, headers: true, ) do |row| 7 # IDが見つかれば、レコードを呼び出し、見つかれなければ、新しく作成 8 user = find_by(id: row["id"]) || new 9 # CSVからデータを取得し、設定する 10 user.attributes = row.to_hash.slice(*updatable_attributes) 11 # 保存する 12 user.save 13 end 14 end 15 16 # 更新を許可するカラムを定義 17 def self.updatable_attributes 18 ["id", "name", "age"] 19 end 20end
index.html.erb
1application.rb 2 3require_relative 'boot' 4 5require 'rails/all' 6require 'csv' 7 8
試したこと
文字コードを変更する際にエラーが出ている。変換の仕方に問題があるとなんとなく検索して原因は分かったのですが(違っていたらすいません)どのように記述すれば変換がうまく行くのか分かりません。
CSV.foreach(file.path, headers: true, ) do |row|
⬇︎
CSV.table(file.path, headers: true, encoding: "SJIS:UTF-8") do |row|
検索した結果 csvはshift-jisで設定すれば上手く行くと書いてあったので
encoding: "SJIS:UTF-8"と付け加えてみましたが改善されませんでした、、
大変申し訳ありませんが何かアドバイス頂けないでしょうか、、汗
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー