我正在制作一个基本的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 中同时包含 zip
和 rubyzip
,但它们都没有解决问题。
每当我看到这样的事情时,我总是问自己你有开发/生产奇偶校验吗?
所以:
- 你在本地使用什么Ruby版本,它与你在Heroku上使用的版本有什么不同吗?
- 您是否在 Gemfile 中指定了 Ruby 版本?
- 如何在本地运行? 您是否使用
bundle exec
来确保以相同的方式运行,使用相同的宝石?
终于想通了。
当我运行ruby app.rb
时,事情在本地工作,但是当我运行bundle exec ruby app.rb
时,我遇到了与在heroku上相同的错误。
我升级到最新版本的存折(今天刚刚更新以处理 rubyzip 的最新更改),但事情仍然不起作用。
事实证明,我需要从我的 Gemfile 中删除gem 'zip'
并只包含gem 'rubyzip'
- 以前我两者都有。