【问题标题】:NameError: uninitialized constant in Rails app when attempting to import CSVNameError:尝试导入 CSV 时 Rails 应用程序中未初始化的常量
【发布时间】:2015-02-20 01:59:17
【问题描述】:

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

提前致谢!

【问题讨论】:

    标签: ruby-on-rails ruby csv activerecord


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-15
      • 2017-07-10
      相关资源
      最近更新 更多