如何将CSV导入Rails应用程序

时间:2015-03-07 22:01:20

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

Rails 4.1.7 Ruby 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

2 个答案:

答案 0 :(得分:2)

例外说文件无法找到。
customers = CSV.read('customers.csv')是一条相对路径。它搜索当前工作目录中的文件(可能不总是在root中)。您可以使用例如:

检查工作目录
raise Dir.getwd.to_s
customers = CSV.read('customers.csv')

并且异常将显示搜索到的文件中的当前文件夹。

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

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

答案 1 :(得分:0)

我终于得到了一项任务:

LIB /任务/ 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

轰!就绪