0

私はルビーにとても慣れていません。ワンクリックで 2 つのファイルをエクスポートする方法について質問があります。

既存のバージョンでは、「def stream_csv」を呼び出して一度に 1 つのファイルしか生成できませんでしたが、2 つのファイルを取得するために 2 回呼び出しようとすると、「ActionController::DoubleRenderError (Can onlyアクションごとにレンダリングまたはリダイレクトを 1 回行う):" おそらく、レンダリングが原因です。

stream_csv のソース コードは次のとおりです。

def stream_csv
    require 'fastercsv'

        filename = params[:action] + ".csv"

        #this is required if you want this to work with IE      
        if request.env['HTTP_USER_AGENT'] =~ /msie/i
            headers['Pragma'] = 'public'
            headers["Content-type"] = "text/plain"
            headers['Cache-Control'] = 'no-cache, must-revalidate, post-check=0, pre-check=0'
            headers['Content-Disposition'] = "attachment; filename=\"#{filename}\""
            headers['Expires'] = "0"
        else
            headers["Content-Type"] ||= 'text/csv'
            headers["Content-Disposition"] = "attachment; filename=\"#{filename}\""
            controller.response.headers["Content-Transfer-Encoding"] = "binary"
        end

        render :text => Proc.new { |response, output|
            csv = FasterCSV.new(output, :row_sep => "\r\n")
            yield csv
        }
    end
end

ワンクリックで 2 つのファイルを作成できますか? はいの場合、どうすればできますか?

4

1 に答える 1

3

そうです、それはのせいですrender。を設定headersし、最後に を呼び出すとrender、ブラウザに送信される HTTP 応答が作成されます。1 つの HTTP リクエストからこれを 2 回行うことはできませんActionController::DoubleRenderError

一度に複数の.csvファイルを送信する 1 つの方法は、それらを 1 つのファイルに結合し、生ファイルの代わりに.zip送信すること.csvです。ファイルの作成に使用できる、優れた非常に使いやすいrubyzipgem.zipがあります。

内部で render を呼び出す代わりに、単にインスタンス自体またはその String 出力stream_csvを返すことができます。FasterCSV呼び出しメソッドから .zip ファイルを作成できます(上記の gemからコピーして貼り付けるだけなので、ここではコードを含めませんREADME) 。

最後に、ダウンロードを強制するために非常に多くのヘッダーを設定する代わりに、Railssend_fileメソッドを見てください。

于 2013-08-14T12:14:06.880 に答える