0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails 6】 テーブルへCSVファイルをインポートした際にNameErrorが出力された時の対処法

Posted at

はじめに

CSVファイルをテーブルにインポートした際に、NameErrorが出力されて躓いたので、備忘録として残します。

開発環境

  • Mac
  • Ruby 2.7.2
  • Rails 6.1.3.1
  • PostgreSQL 13.2

前提

rails db:seedコマンドを実行後、以下のseeds.rbからimport_csv.rbを呼び出して、テーブルにcsvファイルをインポートします。

db/seeds.rb
ImportCsv.information_data
lib/autoloads/import_csv.rb
class ImportCsv
  # CSVデータのパスを引数として受け取り、インポート処理を実行
  def self.import(path)
    list = []

    CSV.foreach(path, headers: true) do |row|
      list << row.to_h
    end

    list
  end

  def self.information_data
    list = import('db/csv_data/information.csv')

    puts "インポート処理を開始"
    Information.create!(list)
    puts "インポート完了!"
  end
end

エラーメッセージ

前提で記載した通り、rails db:seedを実行した結果、以下のエラーメッセージが出力されました。

% rails db:seed
rails aborted!
NameError: uninitialized constant ImportCsv

NameErrorのメッセージ内容を調べてみましたところ、以下の記事によると、NameErrorは定義されていない変数またはメソッドを使用したときに発生するとのことです。

seeds.rbからimport_csv.rbを上手く呼び出せていないのでは?と思いました。

対応方法

以下のようにapplication.rb(すべての環境で共通の設定ファイル)のconfig.autoload_paths(オートロード対象)にlib/autoloadsを指定することで、import_csv.rbを呼び出すようにしました。

config/application.rb
module モジュール名
  class Application < Rails::Application
    # lib/autoloads ディレクトリ配下のファイルを読み込む
    config.autoload_paths << Rails.root.join('lib/autoloads')
  end
end

上記の設定後にrails db:seedを実行してみた結果、テーブルにCSVファイルを上手くインポートすることができました。

% rails db:seed
インポート処理を開始
インポート完了!
% 

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?