NameError(未初始化的常量Unzipper :: Zip),但仅限于Heroku部署(Rails)

时间:2015-09-22 15:11:18

标签: ruby-on-rails ruby heroku ruby-on-rails-4.2

我有一个使用Rubyzip解压缩文件的类var s

在我的本地环境中,我可以成功解压缩文件,而无需使用unzipper.rb

明确地包含依赖项

在Heroku上,我得到require 'zip',我只能使用明确NameError (uninitialized constant Unzipper::Zip)

来解决

问题:为什么在Heroku环境中这是必要的,而不是在localhost上?我的印象是Rails自动需要所有宝石。

应用/服务/ unzipper.rb

require

运行bundler时的Heroku输出包括:

require 'zip'  # Only required for Heroku. Works locally without!

class Unzipper

  OVERRIDE_FILES = true

  def initialize(file)
    @file = file
  end

  def self.unzip(file, &block)
    Unzipper.new(file).unzip(&block)
  end

  def unzip
    open_zip do |zip|
      yield extract_files(zip)
    end
  end

  private

  def open_zip(&block)
    ::Zip::File.open(@file.path, &block)
  end

  def extract_files(zip)
    files = []
    zip.each do |entry|
      path = "#{rails_temp_directory}/#{entry.name}"
      entry.extract(path) { OVERRIDE_FILES }
      files << path
    end
    files
  end

  def rails_temp_directory
    "#{Rails.root}/tmp"
  end
end

我确认两者都使用相同版本的Ruby。

Rubyzip没有初始化程序或环境配置。

的Gemfile

remote:        Using rubyzip 1.1.7

1 个答案:

答案 0 :(得分:11)

Rubyzip的主文件名与其gem名称不同,因此您可能必须在Gemfile中明确指定它:

gem 'rubyzip', require: 'zip'