Próbuję użyć klejnotu roo do przetwarzania arkuszy kalkulacyjnych .xlsx, które są przesyłane przez stronę zewnętrzną. Dostaję następujący błąd:Ruby on Rails Klejnot roo nie może załadować pliku zip/zipfilesystem
LoadError (nie może wczytać takiego pliku - Zip/zipfilesystem):
Znalazłem wiele pytań podobne do tego (jak nie można załadować taki plik - zip/zip) i starałem się podążać za ich rozwiązaniami. Jak dotąd, bezskutecznie.
Pierwotnie wymagane "roo" w kontroler, a po otrzymaniu tego błędu próbowałem wymagające "zip/zip", "zip/zipfilesystem" i po prostu "zip". Żadne z nich nie wydaje się niczego naprawiać. Próbowałem też dodać: require => 'zip',: require => 'zip/zipfilesystem',: require => 'zip/zip' do Gemfile'a i nic z tego nie zmieniło niczego. Oto stosowny kod:
w Gemfile:
# for spreadsheet upload management
gem 'roo'
gem 'rubyzip'
gem 'spreadsheet'
gem 'nokogiri'
zainstalowane wersje:
nokogiri (1.6.0)
roo (1.12.1)
rubyzip (1.0.0)
spreadsheet (0.8.9)
kontroler:
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
Myślę, że ta sprawa jest crapping przed robi do modelu (gdzie jest kod process_spreadsheet()), ale na wszelki wypadek oto kod modelu:
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
Używam szyn 3.2.13 i ruby 2.0.0p195.
Czy potrzebuję czegoś niewłaściwego (lub w niewłaściwy sposób) gdzieś? Daj mi znać, jeśli pomocne będą inne fragmenty kodu. Thaaaaanks.
Czy próbowałeś: 'gem 'rubyzip', '<1.0.0'' w twoim' Gemfile'? Zobacz readme na https://github.com/rubyzip/rubyzip –
Nie ... nie, nie mam. I to jest rażąco na mojej twarzy. Wygląda na to, że naprawiłam mój problem. Pojawił się kolejny problem, ale wydaje się niezwiązany. Jeśli rzucisz to jako odpowiedź, z przyjemnością to zaakceptuję. – Deranger