Railsでzip生成してダウンロードさせる

インストール

% sudo gem1.8 install zipruby

Railsのプロジェクトトップ下にあるGemfileに以下を追加。

gem 'zipruby'

bundleで反映。

% bundle install --local --without production (開発環境)
% bundle install --local --without development(公開環境)

app/views/posters/show.html.erb の出力結果をダウンロードさせるとする。このとき、スタイルシートも一緒にダウンロードしないと見栄えがわるい。スタイルシートが public/stylesheets/main.css であるとき、app/views/layouts/download.html.erb を用意し、ヘッダのスタイルシート部分を以下のようにする。

<link href="main.css" media="screen" rel="stylesheet" type="text/css" />

tmp/downloads以下にダウンロードさせるファイルを生成するとする。app/controller/posters_controller.rb に アクション download_zipを加える。

def download_zip
 〜 処理省略 〜

  prefix = "show-#{params[:id]}"
    action = 'show'
    zipfilename = generate_statichtml_in_zip(action, prefix)
    send_file(zipfilename,
                {:type => 'application/zip',
                :filename => "#{prefix}.zip"})
end 

private

def generate_statichtml_in_zip(action, prefix)
    path = "#{Rails.root}/tmp/downloads/"

    zipfilename = path+prefix+".zip"
    htmlname = prefix+'/'+prefix+".html"
    stylesheet_file = "#{Rails.root}/public/stylesheets/main.css"
    zip_stylesheet_file = prefix+'/main.css'

    if File.exist?(zipfilename)
      File.unlink(zipfilename)
    end

    Zip::Archive.open(zipfilename, Zip::CREATE) do |ar|
      ar.add_dir(prefix)
      ar.add_buffer(htmlname, render_to_string(:action => "#{action}",:layout => "storeable"))
      ar.add_file(zip_stylesheet_file, stylesheet_file)
    end
    return zipfilename
  end

download_zipのアクションを呼び出すとzipファイルがダウンロードされる。