NameError:尝试导入CSV时Rails应用程序中未初始化的常量

时间:2015-02-20 01:59:18

标签: ruby-on-rails ruby csv activerecord

我正在制作一个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)

- 跟踪给了我:

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

提前致谢!

1 个答案:

答案 0 :(得分:3)

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堆栈,以便你可以使用你的模型等。