9

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

我在某处需要错误的东西(或以错误的方式)吗?让我知道是否有任何其他代码片段会有所帮助。太棒了。

4

3 回答 3

14

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

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

最快的“让我的代码像以前一样工作”修复是更改对以下内容的Gemfile引用rubyzip

gem 'rubyzip', '< 1.0.0'

从长远来看,这可能不是最好的解决方法,这取决于您使用rubyzip. roo我希望一些gem出版商,例如rubyzip.


只是意见:

实际看到这一点实际上让我不再喜欢 Ruby gems 主要版本的语义版本控制。如果我在自己的任何项目中打破了向后兼容性,我想我会开始一个新的 gem,并在旧的 gem 上放一个通知。

于 2013-09-06T14:41:24.773 回答
12

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

于 2013-09-21T05:59:07.697 回答
0

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

于 2014-03-03T01:06:01.250 回答