2015-09-22 90 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

相關問題