NameError: uninitialized constant in Rails app when attempting to import CSV

NameError: uninitialized constant in Rails app when attempting to import CSV

我正在制作一个 rails 应用程序,它依赖于基于 CSV 文件的数据库,该文件是我从网站上抓取的。我想将 CVS 文件导入数据库。我生成了一个模型,如下所示。

class Challenge < ActiveRecord::Base
end

还有我的迁移文件:

    class CreateChallenges < ActiveRecord::Migration
  def change
    create_table :challenges do |t|
      t.string :location
      t.string :name_source
      t.string :location_name
      t.string :name_text
      t.string :restaurant_text
      t.string :restaurant
      t.string :location_title
      t.string :description
      t.string :name
      t.string :state

      t.timestamps null: false
    end
  end
end

还有我的 Rakefile:

# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.

require File.expand_path('../config/application', __FILE__)
require 'csv'
require 'Models::Challenge.rb'

Rails.application.load_tasks

csv_text = File.read('db/Vancouver.csv', :encoding => 'iso-8859-1')
csv = CSV.parse(csv_text, :headers => true)
csv.each do |row|
  Challenge.create!(row)
end

当我 运行 rake importbundle exec rake import:challenge 我得到以下错误:

rake aborted!
LoadError: cannot load such file -- Models::Challenge.rb
/Users/kamilkhan/Documents/CPSC 310/Project/Rubies-In-The-Rough/Rakefile:6:in `require'
/Users/kamilkhan/Documents/CPSC 310/Project/Rubies-In-The-Rough/Rakefile:6:in `<top (required)>'
(See full trace by running task with --trace)

--trace 给我:

rake aborted!
LoadError: cannot load such file -- Models::Challenge.rb
/Users/kamilkhan/Documents/CPSC 310/Project/Rubies-In-The-Rough/Rakefile:6:in `require'
/Users/kamilkhan/Documents/CPSC 310/Project/Rubies-In-The-Rough/Rakefile:6:in `<top (required)>'
/Users/kamilkhan/.rvm/rubies/ruby-2.2.0/lib/ruby/2.2.0/rake/rake_module.rb:28:in `load'
/Users/kamilkhan/.rvm/rubies/ruby-2.2.0/lib/ruby/2.2.0/rake/rake_module.rb:28:in `load_rakefile'
/Users/kamilkhan/.rvm/rubies/ruby-2.2.0/lib/ruby/2.2.0/rake/application.rb:689:in `raw_load_rakefile'
/Users/kamilkhan/.rvm/rubies/ruby-2.2.0/lib/ruby/2.2.0/rake/application.rb:94:in `block in load_rakefile'
/Users/kamilkhan/.rvm/rubies/ruby-2.2.0/lib/ruby/2.2.0/rake/application.rb:176:in `standard_exception_handling'
/Users/kamilkhan/.rvm/rubies/ruby-2.2.0/lib/ruby/2.2.0/rake/application.rb:93:in `load_rakefile'
/Users/kamilkhan/.rvm/rubies/ruby-2.2.0/lib/ruby/2.2.0/rake/application.rb:77:in `block in run'
/Users/kamilkhan/.rvm/rubies/ruby-2.2.0/lib/ruby/2.2.0/rake/application.rb:176:in `standard_exception_handling'
/Users/kamilkhan/.rvm/rubies/ruby-2.2.0/lib/ruby/2.2.0/rake/application.rb:75:in `run'
/Users/kamilkhan/.rvm/rubies/ruby-2.2.0/bin/rake:33:in `<main>'

关于如何解决这个问题有什么想法吗?我对 Ruby 和 Rails 很陌生,所以请 ELI5

提前致谢!

Rake 可以为您自动加载所有模型等。此外,您应该将该任务放入其自己的文件中,而不是 rails 使用的 Rakefile。

尝试这样的事情:

lib/tasks/import.rake(任何以 .rake 结尾的文件名都可以)

desc "Imports stuff from CSV"
task :import => :environment do
  require 'csv'

  csv_text = File.read('db/Vancouver.csv', :encoding => 'iso-8859-1')
  csv = CSV.parse(csv_text, :headers => true)
  csv.each do |row|
    Challenge.create!(row)
  end
end

然后您应该能够 运行 rake import 到 运行 该任务。 environment 告诉 rake 加载你的 Rails 堆栈,这样你就可以使用你的模型等