Rails 6:CSV 在响应负载中返回但未下载

Rails 6: CSV is returned at the response payload but not downloaded

我有一个视图允许用户select将一组记录导出到 CSV 文件中。

在用户 select 一组记录并提交包含信息的表单后,CSV 正确生成并返回,但没有询问用户将文件保存在哪里,没有任何反应。在浏览器上检查请求后,我发现数据以原始 CSV 格式存在于响应负载中。如何让浏览器显示保存对话框?


视图有一个包含记录列表的表单,每条记录都可以select编辑(带有复选框)以导出。

<%= 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 %>

控制器正确接收数据并调用class负责构建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

在视图中的from_with方法中添加local: true即可解决问题。

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