Heroku上未定义的方法Zip :: ZipOutputStream.write_buffer

时间:2013-10-28 11:04:56

标签: ruby heroku zip sinatra rubyzip

我正在制作一个基本的Sinatra应用程序来玩Passbook宝石。

我的应用在localhost上正常运行,但是当我尝试在Heroku上运行时,我收到以下错误消息:

/app/vendor/bundle/ruby/2.0.0/gems/passbook-0.2.1/lib/passbook/pkpass.rb:122:in `outputZip'
/app/vendor/bundle/ruby/2.0.0/gems/passbook-0.2.1/lib/passbook/pkpass.rb:60:in `stream'
/app/vendor/bundle/ruby/2.0.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1593:in `call'
NoMethodError - undefined method `write_buffer' for Zip::ZipOutputStream:Class:

当我在我的应用文件中调用行passbook.stream.string时会发生这种情况。

我认为Passbook不是问题所在 - 似乎我的本地机器上的write_buffer版本中存在类方法Zip::ZipOutputStream,但Heroku上没有。为什么是这样?我怎么能绕过它?

我已经尝试在我的Gemfile中单独和同时包含ziprubyzip,但它们都没有解决问题。

2 个答案:

答案 0 :(得分:1)

每当我看到这样的事情时,我总是问自己Do you have Dev/Prod parity?

所以:

  • 你在本地使用什么Ruby版本,它与你在Heroku上使用的版本有什么不同?
  • 您是否在Gemfile中指定了Ruby版本?
  • 你如何在本地运营?您是否使用bundle exec来确保以相同的方式运行,使用相同的宝石?

答案 1 :(得分:0)

终于明白了。

当我运行ruby app.rb时,事情在本地运行,但当我运行bundle exec ruby app.rb时,我得到了与heroku相同的错误。

我升级到最新版本的存折(刚刚更新today以处理rubyzip的最新更改),但事情仍然无效。

原来我需要从我的Gemfile中删除gem 'zip',然后只包含gem 'rubyzip' - 之前我已经同时拥有它们。