Sto tentando di utilizzare il roo gem per elaborare i fogli di calcolo .xlsx che vengono caricati da una parte esterna. Sto ottenendo il seguente errore:ruby on rails roo gem non può caricare zip/zipfilesystem
LoadError (non può caricare tale file - zip/zipfilesystem):
ho trovato un sacco di domande simili a questo (come non può caricare tale file - zip/zip) e ho cercato di seguire le loro soluzioni. Finora, senza successo.
Originariamente avevo bisogno di "roo" nel controller, e dopo aver ricevuto questo errore ho provato a richiedere "zip/zip", "zip/zipfilesystem" e semplicemente "zip". Nessuno di questi sembra risolvere nulla. Ho anche provato ad aggiungere: require => 'zip',: require => 'zip/zipfilesystem',: require => 'zip/zip' al Gemfile, e nessuno di questi sembrava cambiare nulla. Ecco il codice pertinente:
in Gemfile:
# for spreadsheet upload management
gem 'roo'
gem 'rubyzip'
gem 'spreadsheet'
gem 'nokogiri'
versioni installate:
nokogiri (1.6.0)
roo (1.12.1)
rubyzip (1.0.0)
spreadsheet (0.8.9)
controller:
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
Penso che questa cosa è crapping fuori prima che si al modello (dove è il codice process_spreadsheet()), ma nel caso in cui, ecco alcuni codice modello:
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
Utilizzo le guide 3.2.13 e ruby 2.0.0p195.
Sto richiedendo la cosa sbagliata (o nel modo sbagliato) da qualche parte? Fammi sapere se qualche altro frammento di codice sarebbe utile. Thaaaaanks.
Hai provato: 'gem 'rubyzip', '<1.0.0'' nel tuo' Gemfile'? Vedi readme su https://github.com/rubyzip/rubyzip –
No ... no non l'ho fatto. E questo mi sta palesemente in faccia. Sembra che abbia risolto il mio problema. Ho un altro problema che appare, ma sembra non correlato. Se la rispondi come risposta, lo accetterò felicemente. – Deranger