前島様
早速お答え頂き、有り難うございます。
もう少しだけ教えてください。
データベースに格納されているデータをどうやって tar などのコマンドにわたせばよいのでしょうか?
これが分からずに、巡り巡って質問の方法にたどり着いたので。。。
On 2014/02/08, at 23:20, 前島真一 <netwillnet@gmail.com> wrote:
> 前島です。
>
> 無理に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/