首页 > 解决方案 > Rails 6:响应负载返回 CSV 但未下载

问题描述

我有一个视图,允许用户选择要在 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

标签: ruby-on-railsruby-on-rails-6

解决方案


添加local: truefrom_with视图中的方法解决了这个问题。

<%= form_with url: export_to_csv_admin_properties_url, local: true do |form| %>

推荐阅读