質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

2回答

2664閲覧

Ruby on RailsでCSVファイルインポートがエラーになる。

gs13

総合スコア15

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2019/07/17 09:14

編集2019/07/22 08:46

前提・実現したいこと

タブ区切りCSVファイルからのインポートがうまくいかない。
CSVファイルをアップロードすると下記のエラーになる。
検索しても情報が少なく、自力で解決できそうにない。

発生している問題・エラーメッセージ

エラーメッセージ

uninitialized constant BtobQuotation::Csv

エラー画面キャプチャ
イメージ説明
イメージ説明
イメージ説明

CSVファイルをアップロードした際のログ

I, [2019-07-17T18:26:15.712452 #9546] INFO -- : Started POST "/btob_quotations/import" for 192.168.11.30 at 2019-07-17 18:26:15 +0900 I, [2019-07-17T18:26:15.714922 #9546] INFO -- : Cannot render console from 192.168.11.30! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 I, [2019-07-17T18:26:15.771705 #9546] INFO -- : Processing by BtobQuotationsController#import as HTML I, [2019-07-17T18:26:15.772242 #9546] INFO -- : Parameters: {"utf8"=>"✓", "authenticity_token"=>"7PtnpymZqYBn4UOP7OTDiVCi6ZhKZ0WZ8UhM8lzk/DPUqdXybcW6bN+tq/8AatqqK6yK+eUGrk8Qj20wKRd2jA==", "file"=>#<ActionDispatch::Http::UploadedFile:0x00007f433e909f10 @tempfile=#<Tempfile:/tmp/RackMultipart20190717-9546-1tgkswu.csv>, @original_filename="btob_quotations (2).csv", @content_type="application/vnd.ms-excel", @headers="Content-Disposition: form-data; name=\"file\"; filename=\"btob_quotations (2).csv\"\r\nContent-Type: application/vnd.ms-excel\r\n">, "commit"=>"オブジェクトを一括インポート"} D, [2019-07-17T18:26:15.774000 #9546] DEBUG -- : ActiveRecord::SessionStore::Session Load (0.4ms) SELECT `sessions`.* FROM `sessions` WHERE `sessions`.`session_id` = 'cf79cf20b72b18e45fb13cb190223dc2' ORDER BY `sessions`.`id` ASC LIMIT 1 I, [2019-07-17T18:26:15.786085 #9546] INFO -- : Completed 500 Internal Server Error in 13ms (ActiveRecord: 0.4ms) F, [2019-07-17T18:26:15.825356 #9546] FATAL -- : NameError - uninitialized constant BtobQuotation::Csv: app/models/btob_quotation.rb:34:in `open_spreadsheet' app/models/btob_quotation.rb:22:in `import' app/controllers/btob_quotations_controller.rb:86:in `import' I, [2019-07-17T18:26:15.928236 #9546] INFO -- : Started POST "/__better_errors/5de3351b5bd4fa51/variables" for 192.168.11.30 at 2019-07-17 18:26:15 +0900 I, [2019-07-17T18:26:15.929145 #9546] INFO -- : Cannot render console from 192.168.11.30! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255

該当のソースコード

btob_quotations\index.html.erb

<%= form_tag import_btob_quotations_path, multipart: true do %> <%= file_field_tag :file %> <%= submit_tag "オブジェクトを一括インポート" %> <% end %>

config/routes.rb

resources :btob_quotations do post :import, on: :collection end

config/application.rb

require 'csv' require 'iconv'

btob_quotations_controller.rb

def import BtobQuotation.import(params[:file]) redirect_to btob_quotations_url, notice: "レコードを追加しました" end

models\btob_quotation.rb

def self.import(file) spreadsheet = open_spreadsheet(file) header = spreadsheet.row(1) (2..spreadsheet.last_row).each do |i| row = Hash[[header, spreadsheet.row(i)].transpose] btob_quotation = find_by_id(row["id"]) || new btob_quotation.attributes = row.to_hash.slice(*accessible_attributes) btob_quotation.save! end end def self.open_spreadsheet(file) case File.extname(file.original_filename) when ".csv" then CSV.new(file.path, nil) else raise "Unknown file type: #{file.original_filename}" end end

参考にしているサイト

#396 Importing CSV and Excel – RailsCasts

補足情報(FW/ツールのバージョンなど)

Rails 5.0.7.2
Ubuntu VERSION="16.04.6 LTS (Xenial Xerus)"
ruby 2.4.6p354
gem 2.6.14.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

wrong number of arguments (given 3, expected 1..2)

ですから

when ".csv" then CSV.new(file.path, nil)

ここではないですよね?エラーが起きたのは。
どこでしょう? そこのcodeを。

投稿2019/07/25 04:20

winterboum

総合スコア23349

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gs13

2019/08/01 05:40

そこです。エラーが起きたのは。
winterboum

2019/08/01 06:56

CSV.new(file.path, nil) ですから 2つです。 ですが arguments (given 3, expected 1..2) 1か2個を期待してるが3つ というエラーですから、ここではないと思われますが?
guest

0

名前空間の問題でしょうか。他の部分のコードが分からないのですが、いったん、
models\btob_quotation.rb の上部に require 'csv' を記載する、
もしくは 

when ".csv" then Csv.new(file.path, nil, :ignore)

の箇所で、ネームスペースを明示するではどうでしょう? (Csv.newの前に ::をつける)

when ".csv" then ::Csv.new(file.path, nil, :ignore)

追記

すみません。すっかりエラーメッセージのほうに引きずられてしまいました。。。

クラス名が間違っていると思います、うっかりしてすみません。
Csv.new ではなくて、CSV.new(....) と大文字で。

投稿2019/07/17 21:29

編集2019/07/18 14:12
suama

総合スコア1997

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gs13

2019/07/18 01:21

質問している立場で申し訳ないのですが、訳あってすべてのコードが公開できないので、必要な箇所があれば追記します。 ご提示頂いた方法いまどちらも試してみましたがエラーメッセージ変わりませんでした。
suama

2019/07/18 14:14

ごめんなさい、うっかりしてました、おへんじコピペのままでした。 クラス名はCsvでなくCSV、なので、ここさえ直せば、requireの場所はapplication.rbでも大丈夫なはずです。 すみません。。。。
gs13

2019/07/22 07:05

クラス名をCSVにしてみましたが、 wrong number of arguments (given 3, expected 1..2) のエラーになりました。
suama

2019/07/22 08:40 編集

こんにちは!お試しありがとうございます。 メッセージの通りで、引数の数が違うよと言われているので、コードの確認をしてみましょう。 (第二引数はハッシュです) Ref. https://docs.ruby-lang.org/ja/latest/method/CSV/s/new.html
suama

2019/07/26 00:03

念の為。。。 「wrong number of arguments (given 3, expected 1..2) のエラーになりました。」 の時点では引数は3つでしたね。 そのあと、 when ".csv" then CSV.new(file.path, nil) と変更されていますが、このあとでもたぶんエラーになってますよね? オプション無しを指定したいなら、たぶん when ".csv" then CSV.new(file.path, {}) だと思いますが、実際は {} じゃなくて { headers: true } (ヘッダ行あるよ)みたいな指定になるとは思いますが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問