前島です。

無理にRubyで圧縮しようとせずに、Kernel#system メソッドを使って、tar や gzip コマンドなどを呼び出すと良いと思います。


2014年2月8日 22:11 Nobukazu TAKAI <nocturne_2_eflat_9_2@me.com>:
皆様
次のようなことをしたいのですが、できずに詰まっているのでご助言を頂きたくメールしました。
[やりたいこと]
データベースに登録されている PDF データを ZIP or TAR で1つのファイルをまとめてからダウロードするアクションを作る
チェックされた本のPDF をダウンロードしたいです。

book model ( title, abstract, author )
has_one :pdf

pdf model ( data, content_type, filename, book_id )
belongs_to :paper

app/views/books/index.html.erb
...
<%= form_tag(:action=> 'download_pdf') do -%>
  <% @books.each do |book| -%>
    <td><%= book.title -%></td>
    <td><%= book.abstract -%></td>
    <td><%= book.author -%></td>
    <td><%= check_box_tag "checked_items[#{book.id}]", book.id %></td>
  <% end -%>
  <%= submit_tag "チェックした項目の PDF をダウンロード" %>
<% end -%>

とりあえず、圧縮をせずにファイルを次々にダウンロードしようかと以下のような controller を作成したのですが、
Render and/or redirect were called multiple times in this action.
というエラーが出て、うまくいきませんでした。
1つだけチェックボックスをチェックしたときにはファイルをダウンロードできたのですが。
そこで、send_data を実行する前に対象のファイルを1つにまとめてしまえば、全て解決!かと思い、ネットで検索するのですが、思うようなサイトに当たりません。
rubyzip などあることは見つけたのですが、情報が少なくて思うように使えませんでした。

app/controllers/books_controller.rb

  def download_pdf
    if params[:checked_items].present?
      items = params[:checked_items].keys
      items.each do |item|
        @book= Book.find(item)
        if @book.pdf.present?
          send_data @book.pdf.data, type: @book.pdf.content_type, disposition: "attachment", filename: @paper.pdf.filename
        end
      end
    else
      redirect_to :admin_papers, notice: 'チェックされていなかったよ'
    end
  end

ご助言を宜しくお願い致します。



--
前島 真一(@netwillnet)
http://willnet.in/