2017-06-29 4 views
2

私は解決策のいくつかの部分を持っていますが、私はそれらを一緒に持って来るのに困っています。Railsでは、フォームを送信し、CSV形式のページをリクエストするにはどうすればよいですか?

私はCSV形式でダウンロードしたいレコードの開始日と終了日を含む日時文字列を入力する2つのテキストフィールド(form_tag内)を持つページを持っています。

私はsubmit_tagを使用して2つの日付を取得できますが、私はCSVが必要であることをコントローラに伝えるためにビューを取得する方法を知りません。私はlink_toを使うことができますが、paramsは残っています。

私はこのようなものが一緒に機能する方法を把握しようとしているので、ビューとコントローラはちょっと怪しいです。たとえば、リンクとボタンの両方を出荷しません。私はまた、簡潔/プライバシーのために、必要に応じて削除/変更しました。

show.html.erb:

<%= form_tag do %>  
    <br/><br/> 
    <%= label_tag :start_date, "From:" %> 
    <%= text_field_tag :start_date, nil, size: 40 %> 
    <%= label_tag :end_date, "To:" %> 
    <%= text_field_tag :end_date, nil, size: 40 %> 
    <br/> 

    <%= link_to "Export Report", report_path(:csv) %> 

    <%= submit_tag("Generate .CSV", format: :csv) %><br/><br/> 
<% end %> 

report_controller.rb:

require 'csv' 

class ReportController < ApplicationController 
    def show 
    if params[:start_date]   
     @data = get_data(params[:start_date], params[:end_date]) 
     respond_to do |format| 
     format.html 
     format.csv 
     end 
    end 
    end 

    def build_csv_enumerator(header, data) 
    Enumerator.new do |y| 
     CSVBuilder.new(header, data, y) 
    end 
    end 

    def download 
    if params[:start_date] 
     @data = get_data(params[:start_date], params[:end_date]) 
     respond_to do |format| 
     format.html 
     format.csv 
     end 
    end 
    redirect_to action: "show" 
    end 

    private def csv_filename 
    "report-#{Time.now.to_s}.csv" 
    end 
end 

class CSVBuilder 

    attr_accessor :output, :header, :data 

    def initialize(header, data, output = "") 
    @output = output 
    @header = header 
    @data = data 
    end 

    def build 
    output << CSV.generate_line(header) 
    data.each do |row| 
     output << CSV.generate_line(row) 
    end 
    output 
    end 
end 

download.csv.erb:

<%- headers = ["name", "email", "created_at"] -%> 
<%= CSV.generate_line(headers) %> 
<%- @data.each do |line| -%> 
    <%- row = line.values_at(*headers) -%> 
    <%= CSV.generate_line(row) %> 
<%- end -%> 

答えて

2

CSVをダウンロードしたいので、リクエストはGETのリクエストでなければなりません。

リンクは<a href="/reports/1.csv?from=2017-01-01&to=2017-12-31">Download</a>のようになります。私はあなたがブラウザでこのURLを構築することをお勧めします(つまり、レールではなくJavaScriptを使用することを意味します)。

あなたのレールアプリケーションは、拡張子.csvを理解している必要があります。これは、今、あなたはブラウザ

class ReportsController < ApplicationController 
    def show 
    @csv = ... 

    respond_to do |format| 
     # ... 
     format.csv do 
     send_data @csv.to_s # what you send must be a string 
     end 
    end 
    end 
end 
にCSVを送ることができます config/initializers/mime_types.rb

Mime::Type.register "text/csv", :csv 

に設定することができます

1

リンクは自己完結型です。フォームのアクションURLにフォームを送信します(JavaScriptを使用して送信している場合を除き、明らかに必要な操作を行うことができます)。

したがって、あなたはform_tagでそれを指定し、submit_tag上のURLを指定していない:

はちょうどActionController::Base#url_forようurl_for_optionsで構成されたURLにアクションを指すformタグを開始します。

関連する問題