【发布时间】:2021-09-21 10:45:59
【问题描述】:
我有一个视图允许用户选择要导出到 CSV 文件中的一组记录。
在用户选择一组记录并提交包含信息的表单后,CSV 会正确生成并返回,但不会询问用户将文件保存在哪里,而是没有任何反应。在浏览器上检查请求后,我发现数据以原始 CSV 形式存在于响应负载中。如何让浏览器显示保存对话框?
视图有一个包含记录列表的表单,并且可以选择(使用复选框)导出每条记录。
<%= form_with url: export_to_csv_admin_properties_url, multipart: true do |form| %>
<table class="table is-striped">
<thead>
<tr>
<th><%= sortable "id" %></th>
<th><%= sortable "city" %></th>
<th>To export</th>
</tr>
</thead>
<tbody>
<% @properties.each do |property| %>
<tr>
<td><%= property.id %></td>
<td> <%= property.city %> </td>
<td><%= check_box("export", property.id) %></td>
</tr>
<% end %>
</tbody>
</table>
<%= form.submit "Export" %>
<% end %>
控制器正确接收数据并调用负责构建CSV字符串的类:
def export_to_csv
ids_to_export = params[:export].select { |_key, value| value == '1' }.keys
properties = Property.find(ids_to_export)
csv_data = CsvService.export_properties(properties)
send_data csv_data, filename: "exported_properties.csv", type: 'text/csv'
end
【问题讨论】:
-
@dbugger,
csv_data是一个字符串,没有#read方法。第二个参数a是什么? -
根据文档,如果您使用
send_data返回要由浏览器下载的文件,您可能需要添加disposition: 'attachment; filename=exported_properties.csv'或类似名称。此外,您应该在控制器中执行send_data,而不是您的班级。从类中返回 CSV 数据并将其发送给控制器中的用户。 -
@JohnP,它会自动使用这些值定义处置。响应头包含
Content-Disposition attachment; filename="exported_properties.csv"; filename*=UTF-8''exported_properties.csv。send_data在控制器上。 -
那么
export_to_csv方法在控制器中? docs 可能是查找有关其工作原理的信息的最佳位置。那里甚至还有一些 CSV 文件的示例代码。但是,更一般地说,如果响应到达浏览器但未显示,则可能是标题的问题 - Rails 没有传递浏览器需要知道如何处理数据的信息,因此您需要确保您可以通过正确调用send_data来提供它。不过,恐怕我自己也帮不上忙!
标签: ruby-on-rails ruby-on-rails-6