在rails应用程序中导入excel文件

我跟随瑞安·贝茨railcast教程通过导轨应用程序导入excel文件。 我的Ruby版本是2.2.4和rails版本是4.2.6我已经安装了“roo”gem。

我的app \ models \ user.rb文件是:

class User < ActiveRecord::Base require 'csv' def self.import(file) spreadsheet= open_spreadsheet(file) header=spreadsheet.row(1) (2..spreadsheet.last_row).each do |i| row=Hash[[header,spreadsheet.row(i)].transpose] user=find_by_id(row["id"])||new user.attributes=row.to_hash.slice(*accessible_attributes) user.save end end def self.open_spreadsheet(file) case File.extname(file.original_filename) #when ".csv" then Roo::Csv.new (file.path nil, :ignore) when ".xls" then Roo::Excel.new (file.path) #when ".xlsx" then Excelx.new (file.path, nil, :ignore) else raise "Unknown file type: #{file.original_filename}" end end end 

我的应用程序\ controllers \ users_controller.rb文件是:

 class UsersController < ApplicationController def index @users=User.all end def import User.import(params[:file]) redirect_to root_url, notice: "Activity data imported!" end end 

现在我的应用程序主页正常工作。 但是,当我点击“导入excel”button(我在index.html.erb文件中完成了所有这些)之后从文件select器中select了文件后,它显示以下错误:

UsersController#import中的RuntimeError

找不到工作簿,可能是一个空文件传递

还不能解决这个问题。 open_spreadsheet方法已经在那里定义了,那么错误的原因是什么?

尝试改变这一行:

 spreadsheet= open_spreadsheet(file) 

至:

 spreadsheet= User.open_spreadsheet(file) 

编辑:你也失踪,结束:

 def self.import(file) spreadsheet= open_spreadsheet(file) header=spreadsheet.row(1) (2..spreadsheet.last_row).each do |i| row=Hash[[header,spreadsheet.row(i)].transpose] user=find_by_id(row["id"])||new user.attributes=row.to_hash.slice(*accessible_attributes) user.save end end #<----------- 

编辑:

  class User < ActiveRecord::Base require 'csv' def self.import(file) spreadsheet= open_spreadsheet(file) header=spreadsheet.row(1) (2..spreadsheet.last_row).each do |i| row=Hash[[header,spreadsheet.row(i)].transpose] user=find_by_id(row["id"])||new user.attributes=row.to_hash.slice(*accessible_attributes) user.save end end def self.open_spreadsheet(file) case File.extname(file.original_filename) #when ".csv" then Roo::Csv.new (file.path nil, :ignore) when ".xls" then Roo::Excel.new (file.path) #when ".xlsx" then Excelx.new (file.path, nil, :ignore) else raise "Unknown file type: #{file.original_filename}" end end end