はじめに
CSVファイルをテーブルにインポートした際に、NameErrorが出力されて躓いたので、備忘録として残します。
開発環境
- Mac
- Ruby 2.7.2
- Rails 6.1.3.1
- PostgreSQL 13.2
前提
rails db:seed
コマンドを実行後、以下のseeds.rb
からimport_csv.rb
を呼び出して、テーブルにcsvファイルをインポートします。
ImportCsv.information_data
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
を呼び出すようにしました。
module モジュール名
class Application < Rails::Application
# lib/autoloads ディレクトリ配下のファイルを読み込む
config.autoload_paths << Rails.root.join('lib/autoloads')
end
end
上記の設定後にrails db:seed
を実行してみた結果、テーブルにCSVファイルを上手くインポートすることができました。
% rails db:seed
インポート処理を開始
インポート完了!
%