私は解決策のいくつかの部分を持っていますが、私はそれらを一緒に持って来るのに困っています。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 -%>