NameError - неинициализированная константа Zip

Я пытаюсь разархивировать файл в своем плагине Spree.

Определен метод распаковки в модуле, который выглядит так.

module ImportImages
  class Zipper
    def self.unzip(zip, unzip_dir, remove_after = false)
      Zip::File.open(zip) do |zip_file|
        zip_file.each do |f|
          f_path=File.join(unzip_dir, f.name)
          FileUtils.mkdir_p(File.dirname(f_path))
          zip_file.extract(f, f_path) unless File.exist?(f_path)
        end
      end
      FileUtils.rm(zip) if remove_after
    end
  end
end

Я включил драгоценный камень rubyzip в свой Gemfile.

gem 'rubyzip'
gem 'zip-zip'

При попытке запустить его я получаю следующую ошибку.

NameError - uninitialized constant ImportImages::Zipper::Zip:

Я пробовал каждое решение, представленное в stackoverflow и других сайтах. Я попытался понизить версию rubyzip, которая сейчас 1.2.0, и добавить require 'zip' или require 'zip/zip'. Оба вернули ошибку загрузки.

Я попытался добавить require 'zip/filesystem' в класс. Но получил

LoadError - cannot load such file -- zip/zipfilesystem

Любое решение для этого?


person Aswathy    schedule 29.03.2016    source источник
comment
gem 'rubyzip', '< 1.0.0' вы пробовали это?   -  person Rajarshi Das    schedule 29.03.2016
comment
Все еще получаю ту же ошибку. При попытке добавить требование я получаю cannot load such file -- zip/zipfilesystem   -  person Aswathy    schedule 29.03.2016
comment
github.com/rubyzip/rubyzip#important-note вы читали это?   -  person Rajarshi Das    schedule 29.03.2016
comment
просто требуется «rubygems», требуется «zip», больше не требуется   -  person Rajarshi Das    schedule 29.03.2016
comment
Ага. Я так не делаю. Некоторые решения, которые я нашел, понизили версию rubyzip и добавили эти строки. Пробовал это.   -  person Aswathy    schedule 29.03.2016


Ответы (3)


Он ищет вложенную константу. Замените строку Zip::File.open(zip) do |zip_file| ниже:

::Zip::File.open(zip) do |zip_file|

Он должен работать. Также убедитесь, что вам требуются rubygem/bundle setup. Хотя в загуле это уже должно было быть сделано.

person Babar Al-Amin    schedule 29.03.2016
comment
Теперь я получаю NameError - uninitialized constant Zip - person Aswathy; 29.03.2016

Включите rubyzip в файл gem следующим образом:

gem 'rubyzip', require: 'zip'

см. этот вопрос

person Montells    schedule 13.12.2017

Ответ Бабара правильный, но вам также нужно добавить require 'zip' в application_controller.rb

person Patryk    schedule 27.11.2016
comment
добавить запрос «zip», аналогичный ответу @montelis. - person Robert; 10.07.2018