gpt4 book ai didi

ruby-on-rails - 在 Rails 中,如何提交表单并请求 csv 格式的页面?

转载 作者:数据小太阳 更新时间:2023-10-29 07:54:57 24 4
gpt4 key购买 nike

我有几个部分的解决方案,但我无法将它们组合在一起。

我有一个包含两个文本字段(在 form_tag 中)的页面,我将在其中输入一个日期时间字符串,其中包含我要以 CSV 格式下载的记录的开始和结束日期。

我可以使用 submit_tag 并获取两个日期,但是我不知道如何让 View 告诉 Controller 我想要一个 CSV,所以 .我可以使用 link_to,但参数会落在后面。

View 和 Controller 看起来有点不稳定,因为我正试图弄清楚它们应该如何协同工作。例如,我不会同时发送链接和按钮。为了简洁/隐私,我还根据需要删除/更改了一些内容。

显示.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

下载.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 -%>

最佳答案

因为您要下载 CSV,所以请求应该是 GET请求。

您的链接应类似于 <a download href="/reports/1.csv?from=2017-01-01&to=2017-12-31">Download</a> .我建议您在浏览器上构建此 url(这意味着使用 javascript,而不是 rails)。

您的 Rails 应用程序必须理解扩展 .csv .这可以在 config/initializers/mime_types.rb 中配置

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

现在您可以将 CSV 发送到浏览器

class ReportsController < ApplicationController
def show
respond_to do |format|
# ...
format.csv do
@csv = ...
send_data @csv.to_s # what you send must be a string
end
end
end
end

关于ruby-on-rails - 在 Rails 中,如何提交表单并请求 csv 格式的页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44814673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com