2015-09-22 61 views
3

我有一个类unzipper.rb,它使用Rubyzip解压缩文件。NameError(未初始化常量Unzipper :: Zip)但只在Heroku部署(Rails)

在我当地的环境,我能成功地解压缩文件而不显式地包括使用require 'zip'

在Heroku虽然依赖,我得到一个NameError (uninitialized constant Unzipper::Zip)我只能解决使用显式require

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

应用程序/服务/ 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 

Heroku的输出,当运行捆绑包括:

remote:  Using rubyzip 1.1.7 

我验证两者都使用Ruby的版本相同。

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

的Gemfile

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' 
+0

可能的环境问题。尝试将您的本地'RAILS_ENV'设置为'production'来查看是否发生了相同的问题。 – brito

+0

您是否通过'bundle exec'运行脚本? –

+0

@brito我离开我的办公室,但会尝试! – madcow

回答

8

Rubyzip的主文件名是比宝石名称不同,所以你可能需要在Gemfile中明确指定:

gem 'rubyzip', require: 'zip' 
+0

不错!这对我有效。我觉得我从未想过这件事。高五@fivedigit! – jacklin

相关问题