Der*_*ger 9 ruby ruby-on-rails rubyzip nokogiri ruby-on-rails-3
我正在尝试使用roo gem来处理由外部方上传的.xlsx电子表格.我收到以下错误:
LoadError(无法加载此类文件 - zip/zipfilesystem):
我发现了很多类似于这个的问题(比如无法加载这样的文件 - zip/zip),我试图按照他们的解决方案.到目前为止,无济于事.
我最初在控制器中需要'roo',在得到这个错误之后尝试了'zip/zip','zip/zipfilesystem',只是'zip'.这些似乎都没有解决任何问题.我还尝试添加:require =>'zip',:require =>'zip/zipfilesystem',:require =>'zip/zip'到Gemfile,但这些似乎都没有改变.这是一些相关的代码:
在Gemfile中:
# for spreadsheet upload management
gem 'roo'
gem 'rubyzip'
gem 'spreadsheet'
gem 'nokogiri'
Run Code Online (Sandbox Code Playgroud)
安装版本:
nokogiri (1.6.0)
roo (1.12.1)
rubyzip (1.0.0)
spreadsheet (0.8.9)
Run Code Online (Sandbox Code Playgroud)
在控制器中:
require 'roo'
module BatchOrderProcessing
class DataFilesController < ApplicationController
def create
# some code here ...
when ".xlsx"
spreadsheet = Roo::Excelx.new(uploaded_io.path, nil, :ignore)
header = spreadsheet.row(1)
if # some validation stuff...
puts "spreadsheet format inappropriate"
redirect_to # some place
end
process_datafile(fname, spreadsheet)
# more code ...
end
private
def process_datafile(fname, spreadsheet)
@df = DataFile.new
@df[:filename] = ActiveRecord::Base.connection.quote(fname)
if @df.save
begin
# parse asynchronously
datafile_scheduler = Rufus::Scheduler.new
datafile_scheduler.in '3s' do
@df.process_spreadsheet(spreadsheet)
end
redirect_to @df
rescue => e
# more code ...
end
else
# more code ...
end
end
Run Code Online (Sandbox Code Playgroud)
我认为这件事在它到达模型之前就已经开始了(process_spreadsheet()代码在哪里),但为了以防万一,这里有一些模型代码:
def process_spreadsheet(spreadsheet)
# do some stuff
puts "parsing spreadsheet"
(2..spreadsheet.last_row).each do |i|
row = Hash[[header, spreadsheet.row(i)].transpose]
row_array << row
invoice << row.to_s
# some more code....
dfi = DataFileItem.new()
dfi.attributes = row.to_hash.slice(*accessible_attributes)
dfi.data_file_id = self.id
dfi.save
self.data_file_items << dfi
# Update stuff in our DB based on rows in row_array...
end
Run Code Online (Sandbox Code Playgroud)
我正在使用rails 3.2.13和ruby 2.0.0p195.
我在某处需要错误的东西(或错误的方式)吗?如果任何其他代码段有用,请告诉我.Thaaaaanks.
Nei*_*ter 14
rubyzip v1.0.0于2013年8月29日发布:https://github.com/rubyzip/rubyzip/releases
这是一个新的主要版本号,并且依赖于此的多个gem或项目已经被向后兼容性的中断所捕获.
最快的"让我的代码像以前一样工作"修复是改变Gemfile对以下内容的引用rubyzip:
gem 'rubyzip', '< 1.0.0'
Run Code Online (Sandbox Code Playgroud)
从长远来看,这可能不是最好的解决方案,这取决于您使用的方式和/或原因rubyzip.我希望一些宝石出版商(如roo作者)需要弄清楚如何过渡到很好,以便他们自己的用户不会同时满足不兼容版本的需求rubyzip.
只是意见:
实际上看到这一点实际上让我不再是主要版本的Ruby gems语义版本控制的粉丝.如果我打破了我自己的任何项目的向后兼容性,我想我会开始一个新的宝石,并在旧宝石上发布通知.