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
