ruby-on-rails - NameError(未初始化常量 Unzipper::Zip)但仅在 Heroku 部署(Rails)上

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

我有一个类 unzipper.rb,它使用 Rubyzip 解压文件。

在我的本地环境中,我可以成功解压缩文件,而无需使用 require 'zip' 明确包含依赖项

但是在 Heroku 上,我得到一个 NameError (uninitialized constant Unzipper::Zip) 我只能通过使用明确的 require

来解决

问题: 为什么这在 H​​eroku 环境中是必需的,但在本地主机上却不是?我的印象是 Rails 自动需要所有 gem。

app/services/unzipper.rb

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

运行 bundler 时的 Heroku 输出包括:

remote:        Using rubyzip 1.1.7

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

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

gem 文件

source 'https://rubygems.org'

gem 'rails', '4.2.0'

gem 'pg', group: :production

gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc

gem 'slim-rails'

gem 'paperclip'
gem 'rest-client'

gem 'bootstrap-sass', '~> 3.3.3'

gem 'validates_serialized'

gem 'puma'

gem "nokogiri"
gem "cocoon"
gem 'sidekiq'
gem 'sinatra', :require => nil # For sidekiq web monitoring
gem 'aws-sdk', '< 2.0'
gem 'rails_12factor', group: :production
gem 'rubyzip'

group :development, :test do
  gem 'byebug'

  gem 'web-console', '~> 2.0'

  gem 'spring'

  gem 'sqlite3'

  gem 'shoulda-matchers'
  gem 'rspec-rails'
  gem 'factory_girl_rails'
  gem 'capybara'
  gem 'selenium-webdriver'
  gem 'database_cleaner'
  gem 'guard-rspec'
  gem 'faker'
end

group :test do 
  gem 'webmock'
end

ruby '2.2.0'

最佳答案

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

gem 'rubyzip', require: 'zip'

关于ruby-on-rails - NameError(未初始化常量 Unzipper::Zip)但仅在 Heroku 部署(Rails)上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32720548/

相关文章:

ruby-on-rails - 在 Rails 中测试文件上传:无法将 ActionController::TestUploadedFile 转换为字符串

ruby - 使用 ruby​​ 在 git 中 checkout 标签?

ios - 在 Rails 中使用 RPush (APNs) 推送给特定用户

ruby-on-rails - 我如何在 ruby​​ on rails 中按相关性排序

ruby-on-rails -/usr/bin/env : ruby. exe: 没有那个文件或目录

heroku 无法工作(更新错误)

ruby-on-rails - Rails 配置 keystore 返回 nil

ruby-on-rails - 重新加载时 float 的 rails 位置的谷歌地图

ruby-on-rails - 简单表单输入类型

ruby-on-rails - simple_form_for : Removing root model name from params