我正在制作一个基本的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
,但它们都没有解决问题。
答案 0 :(得分:1)
每当我看到这样的事情时,我总是问自己Do you have Dev/Prod parity?。
所以:
bundle exec
来确保以相同的方式运行,使用相同的宝石?答案 1 :(得分:0)
终于明白了。
当我运行ruby app.rb
时,事情在本地运行,但当我运行bundle exec ruby app.rb
时,我得到了与heroku相同的错误。
我升级到最新版本的存折(刚刚更新today以处理rubyzip的最新更改),但事情仍然无效。
原来我需要从我的Gemfile中删除gem 'zip'
,然后只包含gem 'rubyzip'
- 之前我已经同时拥有它们。