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