2013-09-06 6 views
8

Ich versuche, den roo gem zu verwenden, um .xlsx-Tabellen zu verarbeiten, die von einer externen Partei hochgeladen werden. Ich erhalte die folgende Fehlermeldung:Rubin auf Schienen roo gem kann nicht geladen werden zip/zipfilesystem

Loaderror (kann nicht geladen werden solche Datei - zip/zipfilesystem):

ich eine Menge Fragen ähnlich wie diese gefunden haben (zB nicht solche Datei laden - zip/zip) und ich habe versucht, ihren Lösungen zu folgen. Bis jetzt, ohne Erfolg.

Ich ursprünglich 'roo' in der Steuerung, und nach diesem Fehler versucht versucht 'zip/zip', 'zip/zipfilesystem', und nur 'zip'. Nichts davon scheint etwas zu reparieren. Ich habe auch versucht hinzuzufügen: require => 'zip',: require => 'zip/zipfilesystem',: require => 'zip/zip' zum Gemfile, und nichts davon schien etwas zu ändern. Hier sind einige relevante Code:

in Gemfile:

# for spreadsheet upload management 
gem 'roo' 
gem 'rubyzip' 
gem 'spreadsheet' 
gem 'nokogiri' 

installierten Versionen:

nokogiri (1.6.0) 
roo (1.12.1) 
rubyzip (1.0.0) 
spreadsheet (0.8.9) 

in 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 

Ich denke, das Ding aus ist crapping bevor es bekommt an das Modell (wo der Code process_spreadsheet() ist), aber nur für den Fall, hier ist ein Modellcode:

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 

Ich benutze Schienen 3.2.13 und Ruby 2.0.0p195.

Benötige ich irgendwo das Falsche (oder Falsche)? Lassen Sie mich wissen, ob andere Code-Snippets hilfreich wären. Thaaaaanke.

+0

Haben Sie versucht: 'Gem 'Rubyzip', '<1.0.0'' in Ihrem' Gemfile'? Siehe Readme unter https://github.com/rubyzip/rubyzip –

+0

Nein ... nein habe ich nicht. Und das ist irgendwie direkt in meinem Gesicht. Es sieht so aus, dass das mein Problem behoben hat. Ich habe ein anderes Problem, aber es scheint nicht verwandt zu sein. Wenn Sie das als Antwort aufwerfen, nehme ich es gerne an. – Deranger

Antwort

13

rubyzip v1.0.0 wurde 29. August 2013 veröffentlicht: https://github.com/rubyzip/rubyzip/releases

Dies ist eine neue Hauptversionsnummer, und mehr als ein Juwel oder Projekt, das davon abhängt wurde durch den Bruch mit der Rückwärtskompatibilität ertappt.

Die schnellste „mein Code erhalten wie die Arbeit vor“ Fix ist Gemfile Bezug auf rubyzip zu ändern:

gem 'rubyzip', '< 1.0.0' 

Im längerfristigen, dies nicht die beste fix sein kann, hängt davon ab, wie und/oder warum Sie rubyzip verwenden. Ich erwarte, dass einige Verlage wie roo Autoren herausfinden müssen, wie man schön übergeht, damit ihre eigenen Benutzer nicht gleichzeitig mit den Anforderungen für inkompatible Versionen von rubyzip enden.


Gerade Meinung:

dies in Aktion zu sehen tatsächlich hat mich viel weniger ein Fan von Ruby-Gems semantische Versionierung für Hauptversionen. Wenn ich jemals mit Rückwärtskompatibilität bei meinen eigenen Projekten brechen sollte, denke ich, ich werde einfach ein neues Juwel beginnen und den alten Edelstein notieren.

+0

Sehr schöne Erklärung. Danke vielmals. – Deranger

11

Versuchen Sie, den Edelstein zip-zip Ihrem Projekt hinzuzufügen. Es bietet einen einfachen Adapter für Ihre Abhängigkeiten mit der RubyZip v0.9.9 Schnittstelle, die Ihnen erlaubt, auf RubyZip v1.0.0 zu aktualisieren.

+0

OMG. Ich hätte nie erwartet, dass das funktionieren würde! aber ich sagte, hey, ich werde es versuchen, und es hat funktioniert! Vielen Dank Orien! – Aleks