2013-09-06 14 views
8

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.

+0

Hai provato: 'gem 'rubyzip', '<1.0.0'' nel tuo' Gemfile'? Vedi readme su https://github.com/rubyzip/rubyzip –

+0

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

risposta

13

rubyzip v1.0.0 è stato rilasciato 29 agosto 2013: https://github.com/rubyzip/rubyzip/releases

Si tratta di un nuovo numero di versione principale, e più di un gioiello o di un progetto che dipende da questo è stato catturato dalla rottura con retrocompatibilità.

Il più veloce "ottenere il mio codice di lavoro come prima" correzione è di modificare Gemfile riferimento a rubyzip:

gem 'rubyzip', '< 1.0.0' 

Nel lungo termine, questo potrebbe non essere la migliore soluzione, dipende da come e/o perché stai usando rubyzip. Prevedo che alcuni editori di gemme come gli autori di roo avranno bisogno di capire come eseguire una transizione gradevole in modo che i propri utenti non finiscano con i requisiti simultanei per le versioni incompatibili di rubyzip.


Proprio parere:

Vedendo questo in azione ha effettivamente mi ha fatto molto meno un fan di Ruby gemme versioning semantica per le versioni principali. Se mai dovessi rompere con la retrocompatibilità su uno dei miei progetti, penso che inizierò una nuova gemma e metterò un avviso sulla vecchia gemma.

+0

Spiegazione molto bella. Molte grazie. – Deranger

11

Prova ad aggiungere la gemma zip-zip al tuo progetto. Fornisce un semplice adattatore per le dipendenze utilizzando l'interfaccia RubyZip v0.9.9 che consente di eseguire l'aggiornamento a RubyZip v1.0.0.

+0

OMG. Non mi sarei mai aspettato che funzionasse! ma ho detto, hey, farò un tentativo, e ha funzionato! Grazie mille Orien! – Aleks