ruby on rails roo gem не может загрузить zip/zipfilesystem

Я пытаюсь использовать камень ру для обработки .таблицы 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 ответов


rubyzip v1.0.0 был выпущен 29 августа 2013:https://github.com/rubyzip/rubyzip/releases

это новый основной номер версии, и более одного драгоценного камня или проекта, который зависит от этого, был пойман разрывом с обратной совместимостью.

самый быстрый "заставить мой код работать, как раньше" исправить, чтобы изменить Gemfile ссылка rubyzip:

gem 'rubyzip', '< 1.0.0'

в долгосрочной перспективе это может быть не лучшим решением, это зависит от того, как и / или почему вы используете rubyzip. Я ожидаю некоторых издателей gem, таких как rooавторам нужно будет выяснить, как красиво перейти, чтобы их собственные пользователи не оказались с одновременными требованиями к несовместимым версиям rubyzip.


просто мнение:

видя это в действии, на самом деле сделал меня гораздо меньше поклонником семантического управления версиями Ruby gems для основных версий. Если я когда-нибудь нарушу обратную совместимость в любом из моих собственных проектов, я думаю, что просто заведи новый камень и напиши объявление на старом камне.


попробуйте добавить zip-zip gem для вашего проекта. Он предоставляет простой адаптер для ваших зависимостей с помощью RubyZip v0.9.9 интерфейс, позволяющий перейти на RubyZip v1.0.0.


Это было исправлено в драгоценном камне roo. Вам нужно обновить до версии 1.12.2 или выше исправить. См. вопрос здесь:https://github.com/Empact/roo/pull/65