【问题标题】:How to import CSV to Rails app如何将 CSV 导入 Rails 应用程序
【发布时间】:2015-03-07 22:01:20
【问题描述】:

导轨 4.1.7 红宝石 2.1.4

我正在尝试通过控制器方法将 CSV 文件上传到我的应用程序:

routes.rb

get 'csv_upload', to: 'users#csv_upload'

users_controller.rb def csv_upload

 require 'csv'    

  customers = CSV.read('customers.csv')

  customers = CSV.parse(csv_text, :headers => true)
  customers.each do |row|
    Moulding.create!(row.to_hash)
  end

  redirect_to users_url

end

CSV 文件 customer.csv

gender ,age
10,20
11,20
12,20
13,20
14,20
15,20

它位于根目录。这是我得到的错误:

Errno::ENOENT in UsersController#csv_upload
No such file or directory @ rb_sysopen - customers.csv

Extracted source (around line #72):
70
71
72
73
74
75


customers = CSV.read('customers.csv')
customers = CSV.parse(customers, :headers => true)

Rails.root: /Users/andreucasadella/rails_projects/hackcdmx

【问题讨论】:

    标签: ruby-on-rails ruby csv ruby-on-rails-4


    【解决方案1】:

    Exceptions 表示找不到该文件。
    customers = CSV.read('customers.csv') 是相对路径。它在当前工作目录中搜索文件(可能并不总是在根目录中)。您可以检查工作目录,例如:

    raise Dir.getwd.to_s
    customers = CSV.read('customers.csv')
    

    异常会显示当前文件夹在哪个文件中被搜索。

    为避免这种情况,您最好直接用Rails.root指定路径,例如:

    customers = CSV.read(Rails.root.join('customers.csv'))
    

    【讨论】:

    • 嗨@Ablebeam,如果我尝试 raise Dir.getwd.to_s customers = CSV.read(Rails.root.join('customers.csv')) 我得到这个运行时错误:RuntimeError in UsersController# csv_upload
    • 这只是查看包含哪个变量的一种方法。更好的方法是使用一些调试器,如prybyebug。但在这种情况下,您应该会看到类似 RuntimeError: '/home/user/path/to/rails-app/or-other-directory' 的内容,这只是为了确保当前(相对)路径不是 Rails.root
    【解决方案2】:

    我终于通过一个任务得到了它:

    lib/tasks/task.rake

    namespace :tasks do
        require 'csv'
    
        desc "cargar usuarios"
        task :load_usuarios => :environment do |t, arg|
            user_files =['lib/datasets/customers.csv']
            user_files.each do |user|
                CSV.foreach(user,:headers => true) do |row|
                    id = row.to_hash['id']
                    gender = row.to_hash['gender']
                    age = row.to_hash['age']
                    User.create(id: id,gender: gender,age: age)
                end 
            end 
        end 
    end
    

    创建了一个名为“datasets”的文件夹并将文件“customer.csv”保存在这里:

    app/lib/datasets/customer.csv
    

    然后通过终端执行任务

    rake tasks:load_usuarios
    

    轰隆隆!准备好了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-04
      相关资源
      最近更新 更多