使用Roo-xls gem保存Rails之前validation上传的Excel文件

在模型中,在上传.xls文件之前,我希望能够在应用程序保存excel文件之前对其进行validation。 我试图从:file_url对象(comits表中列的.xls文件将被保存)中打开要保存的excel文件,然后validation它,但我得到一个no implicit conversion of Symbol into String错误。

validation的工作,当我把一个excel文件的已经上传和保存到Roo::Excel.new("")的实际文件path,但是这打败了我的validation的目的。

我怎样才能抓住Excel文件没有被存储在应用程序?

我感谢帮助! 我希望不是太混乱。

这是我的comit.rb

 class Comit < ActiveRecord::Base belongs_to :user mount_uploader :file_url, ComitUploader, mount_on: :file_url validates :filename, :file_url, presence: true validates_format_of :file_url, with: /.xls/, message: "Wrong file format" before_save :validate_excel def validate_excel sheet = Roo::Excel.new(:file_url) errors = [] header = sheet.row(1) num_of_columns = sheet.last_column errors << 'Need headers' unless errors << 'Need more columns' if num_of_columns < 21 errors end end 

您将符号:file_url传递给Roo::Excel.new ,它需要一个文件path。 尝试:

 sheet = Roo::Excel.new(file_url) 

你可以发送临时文件Roo
假设您将文件发送给params :file

 Roo::Excel.open(params[:file].tempfile.to_path.to_s) 

好吧,我明白了。 而不是Roo::Excell ,它需要

 sheet = Roo::Spreadsheet.open(self.file_url) 

在我的情况下,以下代码工作正常。 (假设你已经安装了所需的gem) 在我的情况下,我的根目录中有.xls文件

 require 'roo' require 'roo-xls' class ExcelReader def read_file() sheet = Roo::Spreadsheet.open('Test.xls') sheet.each do |row| puts row end end obj=ExcelReader.new() obj.read_file() end