目的
自分がこっそり作っているプロダクトで、写真をまとめて1つのzipファイルにしてダウンロードできるようにしたかったので、Rails上で圧縮ファイルが作れる方法を探してみました。
するとrubyzipが定番ぽかったので、これを使ってみたときにつまづいた点を記録しておきます。
rubyzip
これです。
https://github.com/rubyzip/rubyzip
Railsで使う場合は、 Gemfile に追加して bundle install すればいいだけですね。
つまづいたところ
NameErrorが出る
以下のようなエラーが表示される。
NameError (uninitialized constant BasketsController::Zip): app/controllers/baskets_controller.rb:12:in `download'
こちらが参考になりました。
ruby on rails - rubyzip - cannot load such file -- zip - Stack Overflow
こう書いて解決しました。
gem 'rubyzip', '>= 1.0.0', require: 'zip'
RailsだとGemfileにrequireを書くんですかねぇ?
すでに古いrubyzipが入っていた
私が作ったプロダクトにはすでにrubyzipが入っていましたが、そもそもRailsをnewしたのがずいぶん前のせいなのか、rubyzipのバージョンが0.9系でした。このバージョンだとrubyzipのインターフェースが違うみたいなのでupdateしたいところです。
$ bundle update rubyzip
と打つと個別のモジュールをupdateできるみたいです。
ZipErrorになる
私の場合、zipファイルをtempディレクトリに置きたかったので、Tempfileモジュールを使って先にファイルを作って、そこにzipファイルを上書きしたいと思っていました。
しかしこのやり方だと、以下のようなエラーがでました。
Zip::ZipError (Zip end of central directory signature not found): app/controllers/baskets_controller.rb:13:in `download'
ここを参考にして解決しました。
Create a temporary zip file to send as response in Rails | Think In Geek
正直よくわかってないので、まるっと参考にさせてもらいました。