ruby on rails roo gem无法加载zip / zipfilesystem

时间:2013-09-06 13:55:14

标签: ruby-on-rails ruby ruby-on-rails-3 nokogiri rubyzip

我正在尝试使用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'

已安装的版本:

nokogiri (1.6.0)
roo (1.12.1)
rubyzip (1.0.0)
spreadsheet (0.8.9)
控制器中的

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

我认为这件事在它到达模型之前就已经开始了(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

我正在使用rails 3.2.13和ruby 2.0.0p195。

我在某处需要错误的东西(或错误的方式)吗?如果任何其他代码段有用,请告诉我。 Thaaaaanks。

3 个答案:

答案 0 :(得分:14)

ruby​​zip v1.0.0于2013年8月29日发布:https://github.com/rubyzip/rubyzip/releases

这是一个新的主要版本号,并且依赖于此的多个gem或项目已经被向后兼容的中断所捕获。

最快的“让我的代码像以前一样工作”修复是改变Gemfilerubyzip的引用:

gem 'rubyzip', '< 1.0.0'

从长远来看,这可能不是最佳解决方案,具体取决于您使用rubyzip的方式和/或原因。我希望某些宝石出版商(如roo)的作者需要弄清楚如何过渡,以便他们自己的用户不会同时满足rubyzip不兼容版本的同时要求。


只是意见:

实际上看到这一点实际上让我不再是主要版本的Ruby gems语义版本控制的粉丝。如果我打破了我自己项目的向后兼容性,我想我会开始一个新的宝石,并在旧宝石上发布通知。

答案 1 :(得分:12)

尝试将zip-zip gem添加到您的项目中。它使用RubyZip v0.9.9接口为您的依赖项提供了一个简单的适配器,允许您升级到RubyZip v1.0.0。

答案 2 :(得分:0)

这已在roo gem中修复。您需要更新到1.12.2或更高版本才能修复。请在此处查看问题:https://github.com/Empact/roo/pull/65