在使用 Rails 和 Roo-xls gem 保存之前验证上传的 Excel 文件
Validation of uploaded Excel file before save using Rails with Roo-xls gem
在模型中,在上传 .xls
文件之前,我希望能够在应用程序保存文件之前验证 excel 文件。我正在尝试从 :file_url
对象(将保存 .xls
文件的 comits table 中的列)打开要保存的 excel 文件,然后验证它但我收到 no implicit conversion of Symbol into String
错误。
当我将已由 carrierwave 上传并保存的 excel 文件的实际文件路径放入 Roo::Excel.new("")
时,验证有效,但这违背了我验证的目的。
如何获取 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
,它需要文件的路径。尝试:
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 'roo-xls'
gem 才能阅读电子表格。
在我的例子中,以下代码工作正常。 (假设您已经安装了所需的 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
在模型中,在上传 .xls
文件之前,我希望能够在应用程序保存文件之前验证 excel 文件。我正在尝试从 :file_url
对象(将保存 .xls
文件的 comits table 中的列)打开要保存的 excel 文件,然后验证它但我收到 no implicit conversion of Symbol into String
错误。
当我将已由 carrierwave 上传并保存的 excel 文件的实际文件路径放入 Roo::Excel.new("")
时,验证有效,但这违背了我验证的目的。
如何获取 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
,它需要文件的路径。尝试:
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 'roo-xls'
gem 才能阅读电子表格。
在我的例子中,以下代码工作正常。 (假设您已经安装了所需的 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